MySQL

【SQL】グループ中の最大値のレコードを取得する方法

2016/01/06

SQLのGROUP BY句とMAX()を利用して、グループ化したレコード中から最大値をもつレコードを抽出する方法を備忘録としてポストします。

以下の様な社員マスタ、出張先マスタ、出張管理テーブルがあるとします。
出張管理テーブルから、各社員の最新の出張先を抽出したい場合のSQLを考えます。

GROUP BY 及び MAX() でグループ中の最大値を抽出する

レコード作成

社員マスタ (users)

uses_table_01

出張先マスタ (places)

places_table

出張管理テーブル (trips)

trips_table_01

SQLを考える

考え方としては、「社員ごと」でレコードを「グループ化」し日付の大きいレコードを抽出すれば良い、ということ。鈴木(user_id:1)で考えると、

trips_table_02

の内、id:1のレコードが対象となるようです。

tripsテーブルの内部IDが大きい方が最新と思いがちですが、そうでない場合も多々考えられるので、IDを比較するのではなく、日付を比較するのが吉。

これをSQLに落としこむと、以下のようになります。

結果

trips_table_03

欲しいレコードが抽出出来ています。
色をつけた、INNER JOIN 部分がミソ。ここで表題にも挙げている、GROUP BY(グループ化)とMAX(最大値の取得)を行っています。
この方法を4年前に知っていたかったなぁ。

-MySQL
-, , ,