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の解説のために適当に作ったデータ。