プロが教えるわが家の防犯対策術!

前提として下記のようなテーブルがあります。

テーブル名:test
フィールド:
1)id: varchar, not null
2)name: varchar
3)date: timestamp with time zone, not null

このテーブルに下記のようなレコードがあります。
'00001', 'A', '2005-01-01 00:00:00'
'00001', 'B', '2005-07-01 00:00:00'
'00001', 'C', '2005-11-01 00:00:00'
'00002', 'X', '2005-01-20 00:00:00'
'00002', 'Y', '2005-07-20 00:00:00'
'00002', 'Z', '2005-11-20 00:00:00'

■今やりたいこと
このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。

■やってみたこと
下記SQLを発行しました。
>select id, max(date) from test group by id order by id
結果==>
00001 2005-11-01 00:00:00
00002 2005-11-20 00:00:00

実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。

■だめだったSQL
select id, name, max(date) from test group by id order by id

どのようにSQLを書けばよろしいでしょうか?

A 回答 (2件)

初めに、PrimaryKeyがIDとNAMEという事を想定します。



SELECT TEST.ID, TEST.NAME, WK.DATE
FROM TEST,
(
SELECT TEST.ID, MAX(TEST.DATE) AS DATE
FROM TEST
GROUP BY TEST.ID
) WK
WHERE TEST.ID = WK.ID AND
TEST.DATE = WK.DATE
ORDER BY TEST.ID

動作確認済み。
    • good
    • 0
この回答へのお礼

ありがとうございます!!
解決しました!!!

お礼日時:2005/11/09 11:45

ORACLEの場合だったら以下で出来たはず。


where条件2項目をカッコでくくるのがミソ。
PostgresSQLでも通用するか、結果を教えてください。

select id, name, date from test
where (id, date) =
(
select (id, max(date)) from test group by id order by id
)

この回答への補足

回答ありがとうございます。
早速PostgreSQLで試したところ、

ERROR: more than one row returned by a subquery used as an expression

とエラーが返ってきました。どうやらサブクエリからの複数列の取得がPostgreSQLではサポートされていないようです。

補足日時:2005/11/09 11:34
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!