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 )