■ はじめに
SQLで、最新日付データを取りたい時って多々あるのでメモ。
目次
【1】方法 【2】サンプル 【3】補足:過去直近データを取得する場合
【1】方法
SELECT * FROM テーブル名 AS A1 INNER JOIN (SELECT 主キー, MAX(カラム名) AS latest FROM テーブル名 GROUP BY 主キー)) AS A2 ON A1.主キー = A2.主キー AND A1.カラム名 = A2.latest
【2】サンプル
1)PostegreSQLの場合
サンプルデータ
-- テーブル定義 CREATE TABLE item ( id character(8), name character varying(100), price numeric(10, 2), updatedate timestamp without time zone ); -- データ INSERT INTO item(id, name, price, updatedate) VALUES ('I0000001', 'apple', 100, '2014-01-02 12:20:22'), ('I0000001', 'apple', 100, '2014-01-02 13:20:22'), ('I0000001', 'apple', 101, '2014-11-22 12:23:22'), ('I0000001', 'apple', 99, '2015-10-02 12:10:23'), ('I0000001', 'apple', 120, '2015-12-02 12:23:22'), ('I0000002', 'Orange', 62, '2014-01-01 12:20:22'), ('I0000002', 'Orange', 76, '2014-03-02 13:20:22'), ('I0000002', 'Orange', 92, '2014-11-22 12:23:22'), ('I0000002', 'Orange', 101, '2015-02-02 12:10:23'), ('I0000002', 'Orange', 67, '2015-12-02 12:23:22'), ('I0000002', 'Orange', 67, '2016-01-02 12:23:22');
SQL文
SELECT i.id, i.name, i.price, i.updatedate FROM item AS i INNER JOIN (SELECT id, MAX(updatedate) AS latest FROM item GROUP BY id) AS m ON m.id=i.id AND m.latest = i.updatedate ORDER BY id
出力結果
id name price updatedate I0000001 apple 120 2015-12-02 12:23:22.000 I0000002 Orange 67 2016-01-02 12:23:22.000
【3】補足:過去直近データを取得する場合
* この方法を応用すれば、「過去直近データを取得する」こともできる。 詳細は以下の関連記事を参照のこと。
過去直近データを取得するには
https://dk521123.hatenablog.com/entry/2016/01/05/234938
参考文献
http://lightgauge.net/database/sqlserver/1672/
関連記事
サブクエリ / 副問合せ
https://dk521123.hatenablog.com/entry/2015/12/21/002727
過去直近データを取得するには
https://dk521123.hatenablog.com/entry/2016/01/05/234938