• ベストアンサー

これをSQLでやることは可能ですか?

すいません。どうしても閃かないので教えてください。 まず、テーブルは 連番  PK コード 日付 となっています。 その中のデータは 連番  コード   日付 -----+--------+--------- 1   |   001 | 2002/01 2   |   001 | 2002/02 3   |   002 | 2002/03 4   |   002 | 2002/04 5   |   003 | 2002/05 -----+--------+--------- となっています。 このデータの中から 「コード毎に日付が一番新しい連番」を取得したいのですが可能でしょうか? 結果は 連番   コード   日付 -----+--------+--------- 2   |   001 | 2002/02 4   |   002 | 2002/04 5   |   003 | 2002/05 -----+--------+--------- となって欲しいのですが・・・ どなたかこれを実現するSQLを教えてください。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.4

こんにちわ。 Oracle で確認してみました。 SQL> desc test 名前 NULL? 型 ------------ -------- ----------- 連番 NOT NULL NUMBER(4) コード VARCHAR2(4) 日付 VARCHAR2(8) SQL> select * from test; 連番 コー 日付 ---------- ---- -------- 1 001 2002/01 2 001 2002/02 3 002 2002/03 4 002 2002/04 5 003 2002/05 SQL> Select 連番, コード, 日付 from test    where (コード, 日付) IN     (Select コード, MAX(日付) from test group by コード); 連番 コー 日付 ---------- ---- -------- 2 001 2002/02 4 002 2002/04 5 003 2002/05

SIM
質問者

お礼

回答ありがとうございました。 わざわざ結果の確認までしていただいてほんとありがとうございました。 muyoshidさんの親切な回答のおかげで解決できました。

その他の回答 (3)

  • timber
  • ベストアンサー率29% (218/739)
回答No.3

select a.連番, a.コード, a.日付 from テーブル a where a.日付 = ( select max(日付) from テーブル where コード = a.コード );

SIM
質問者

お礼

回答ありがとうございました。 なるほどこの方法でいけますね。 ひとついい勉強になりました。

  • mfuku
  • ベストアンサー率50% (173/345)
回答No.2

副問い合わせ(サブクエリー)を使用します。 SELECT * FROM テーブル名 テーブルの別名1 WHERE テーブルの別名1.連番 >= ( SELECT MAX(テーブルの別名2.連番) FROM テーブル名 テーブルの別名2 WHERE テーブルの別名1.コード = テーブルの別名2.コード) 実際にそういったテーブルを作ってこのSQLを動かしたわけではありませんので、もしかしたら微妙に違っている部分もあるかもしれませんが、基本的にはこの考え方で大丈夫です。 また、RDBMSによりSQLの構文が多少異なるかもしれません(その辺は提示されてませんので汎用的な構文にしました)。

SIM
質問者

お礼

回答ありがとうございました。 もうすこしSQLの勉強に励みます。

noname#3345
noname#3345
回答No.1

データベースはなんですか? SQLサーバーとかオラクルとか・・・。 それによってやり方、書き方など違ってきます。 補足お願いします。

SIM
質問者

補足

ごめんなさい、肝心なことを忘れていました(^^;) DBはOracle8iです。

関連するQ&A