SQL 最大値を持つ列を取得

前に似たようなエントリを書いた。

とりあえずMySQL上でテストした事を書くけど、MySQL限定の話ではない。

以下のようなテーブル

CREATE TABLE  `test`.`testmax` (
`ID` int(10) unsigned NOT NULL,
`DateField` datetime NOT NULL,
`NumField` int(10) unsigned NOT NULL,
`Val` double NOT NULL
);

データの中身としては

ID DateField NumField Val
1 2007-12-20 1 3
3 2007-10-01 1 2
3 2007-10-01 2 4
3 2007-10-01 3 2.3
3 2007-11-01 1 3.3
3 2007-11-01 2 4.1

○やりたい事
各ID毎に最新の日付のレコードの中で最大のNumFieldを持つ値を取り出す。

欲しい結果としては

ID DateField NumField Val
1 2007-12-20 1 3
3 2007-11-01 1 3.3

とりあえずこれが最適かどうかは知らないけど、以前やったのにもう1つiNNER JOINを加えて何とか出来た。SQLって難しい…

SELECT t1.* FROM test.testmax t1
INNER JOIN (
SELECT t2.ID, t2.DateField, Max(NumField) as MAXNUM FROM test.testmax t2
INNER JOIN (
SELECT ID, MAX(DateField) as MAXDATE FROM test.testmax
GROUP BY ID
) as t3
ON (
t2.ID = t3.ID
AND t2.DateField = t3.MAXDATE
)
GROUP BY t2.DateField
) as t4
ON (
t1.ID = t4.ID
AND t1.DateField= t4.DateField
AND t1.NumField = t4.MAXNUM
)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です