【SQL】あるグループにおける最新のレコードの全てのカラムを取得する SQL

  • 2021年1月29日
  • SQL

 あるグループにおける最新のレコードの全てのカラムを取得する SQL が次です。

SELECT *
FROM members
    INNER JOIN ( # 対象のレコードのみが残る様に INNER JOIN で他レコードを落とします
        SELECT max(created_at) as last_created_at, # 最新を示す値
               gender # グループを定める値
        FROM members
        GROUP BY gender # グループ化
    ) latest_gender_members
        ON latest_gender_members.last_created_at = members.created_at # 最新
        AND latest_gender_members.gender = members.gender # かつ同グループ

 情報を得たい対象と同範囲を探索するサブクエリを発行し、サブクエリの結果と INNER JOIN することで取得可能です。
 処理を分解すると次の様になります。
 まず内部のサブクエリで各グループを示す値と最新の値をとります

        SELECT max(created_at) as last_created_at, # 最新を示す値
               gender # グループを定める値
        FROM members
        GROUP BY gender # グループ化

 これを行うと例えば次の様な表を得られます。

# last_created_at gender
1 2021-01-28 09:52:23 0
2 2021-01-28 09:47:23 1
3 2021-01-28 09:09:19 2
4 2021-01-28 09:12:41 9

 グループを示す値である gender と最新を示す値である last_created_at を持つあるグループにおける最新を示す行の集まりです。これを次の様にINNER JOINすることで最新でないレコードを省き、

FROM members
    INNER JOIN (
      # gender, last_created_at カラムに最新を示す情報を持つ表
    ) latest_gender_members
        ON latest_gender_members.last_created_at = members.created_at # 最新
        AND latest_gender_members.gender = members.gender # かつ同グループ

 SELECT * で最新のレコードについての全てを得ます。

SELECT *

 この様にすることで最新のレコードのみを抽出できます。抽象版はうまく説明できないため省きましたが、最新以外にも様々な集約結果と組み合わせて使えます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG