SQL 最大値を持つ列を取得

例えば以下のような製品名、サイズ、値段と最終更新日を入力するテーブルを考える。データはINSERTするのみ。同じ製品でもサイズが違えば値段は違うものとする。

PRODUCT SIZE UPDATED PRICE
シャツ1 L 2007-01-01 2900
シャツ1 S 2007-01-01 2900
シャツ1 L 2007-02-01 1900
シャツ2 S 2007-01-01 4900
シャツ2 S 2007-02-01 3900

こっから各製品の現在の値段を一覧を知りたい。PRODUCTとSIZEでGROUP BYして、各グループからUPDATEDが最大の列を選べばいい。

ま、結論から書くとこんな感じ。MySQLの場合だけど、他のDBMSでも大体一緒かと。

SELECT T.* FROM TABLE1 T
INNER JOIN (
SELECT MAX(UPDATED) AS LAST_UPDATED
FROM TABLE1
GROUP BY PRODUCT, SIZE
) AS T2
ON (
T1.PRODUCT=T2.PRODUCT
AND T1.SIZE=T2.SIZE
AND T1.UPDATED = LAST_UPDATED)

ON句に注目って感じ

ちなみにMySQLの場合、上の例でのAS T2をサブクエリーの中のFROM TABLE1の後に付けると、以下のようなエラーになった。

Every derived table must have its own alias

参考にしたのは、このページの5-2の直前に書いてあるSQL。


実際にこのような商品データを扱う場合は当然違うテーブル設計にするけど、今回のSQLの解説のために適当に作ったデータ。

コメントを残す

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