前に似たようなエントリを書いた。
とりあえず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
)
コメントする