- PR -

古いものを見るには?

投稿者投稿内容
みけ
会議室デビュー日: 2003/09/03
投稿数: 13
投稿日時: 2004-08-27 08:39
みけです。

データの履歴管理しているテーブルがあります。
項目的にはIDと作成日とその他のデータがあります。

その中で、最初に作成されたデータを抽出したい場合
どのようなSQLを組めば求めることができるのでしょうか?

--

ID DATE DATA
11 08/25 AAAA
11 08/26 BBBB
11 08/27 CCCC
12 08/26 DDDD
12 08/27 EEEE

上記の例で、欲しいデータはAAAAとDDDDです。

始めは以下のように組めばいいかと思ったのですが、
GROUP BYとORDER BYを組み合わせることが出来なくて。。。
SELECT DATA
FROM TABLE
WHERE ROWNUM=1
GROUP BY ID
ORDER BY DATE

どのようにすれば、よろしいのでしょうか???
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-08-27 08:50
SELECT SUBSTR(MIN(CONCAT(CAST(DATE AS CHAR),DATA)),11)
FROM TABLE
GROUP BY ID

てなとこですか。
MySQLのSQLで記述してます。
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2004-08-27 08:56
とりあえずGROUP BYの使い方を理解されていないようですので、
こちらをご覧になれば解決できるかと思います。

http://www.atmarkit.co.jp/fnetwork/rensai/sql03/sql1.html
_________________
まゆりん @ わんくま同盟
Blog る。
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-08-27 08:59
引用:

SELECT SUBSTR(MIN(CONCAT(CAST(DATE AS CHAR),DATA)),11)
FROM TABLE
GROUP BY ID



なかなかアホなコード書いてますね。連結ソートを使用することもありますが、
連結したままの列を、結果セットとして返すなんて信じられません。
そんなことしたら、後工程で文字列処理が発生するし、型が失われますよ。

普通はサブクエリを使います。

select
ID,
(select i.DATA from TABLE as i where i.ID = o.ID and i.DATE = min(o.DATE)) as DATA
from TABLE as o
group by ID
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2004-08-27 09:08
まぁDBMSによっては未だサブクエリを使えないものもあるので使わずに書いたまでですが。
またもや無知が露呈してしまいましたな

# また別人を装われますかな
ぼんじぃ
ベテラン
会議室デビュー日: 2004/05/21
投稿数: 70
投稿日時: 2004-08-27 09:11
一応MSDEで試したところ次のSQLで取得できました。(DATEは日付型でいいのかな?)

SELECT X.DATA FROM TABLE X, (SELECT ID, MIN(DATE) AS DATE FROM TABLE GROUP BY ID) Y WHERE X.ID=Y.ID AND X.DATE=Y.DATE

ってな感じです。
もっとスマートな方法があると思いますが、私のレベルではこの程度です。

[追記]
MySQLで同じSQL実行したらエラーになりました

[ メッセージ編集済み 編集者: ぼんじぃ 編集日時 2004-08-27 09:15 ]
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-08-27 09:15
rownum 擬似列って事は、Oracleですよね。
SQLはRDMSによって方言があったり利用出来る関数が異なるので
何のRDMSを使っているか記述する事をお勧めします。

まず、rownum 擬似列の性質を理解する必要があります。

rownum 擬似列は、他のWhere条件句の後に評価されますが、
Group by句やOrder by句よりも先に評価されます。
よって、みけさんの手段は無効です。

また、
>その中で、最初に作成されたデータを抽出したい場合
では無く、
「その中で、最初に作成されたレコードを抽出したい場合」ですよね?

一般には、上記の性質を踏まえ下記の2通りで考えます。

1.「日付順に並べた結果」から「1件目」のデータを取得
2.「最新日付を取得した結果」から「最新日付を指定して」データを取得

つまり、どちらも副問合せを利用します。

PG、SEどちらでも基本であり、データ処理には重要な考えです。
よって以上のヒントのみにします。

がんばってケロ!
未記入
大ベテラン
会議室デビュー日: 2003/11/24
投稿数: 121
投稿日時: 2004-08-27 09:19
引用:

まぁDBMSによっては未だサブクエリを使えないものもあるので使わずに書いたまでですが。
またもや無知が露呈してしまいましたな



サブクエリが使えない環境について配慮した旨一言も添えられてないね。
てゆーか、MySQL っていまだにサブクエリ使えないの?
トランザクションもサブクエリもサポートされたんだと思ってたけど。

まぁ、ひとりで一生恥ずかしい結果セット返しててください。

スキルアップ/キャリアアップ(JOB@IT)