あるグループにおける最新のレコードの全てのカラムを取得する 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 *
この様にすることで最新のレコードのみを抽出できます。抽象版はうまく説明できないため省きましたが、最新以外にも様々な集約結果と組み合わせて使えます。