【SQL】最新日付データを取得するには

■ はじめに

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