PostgreSQL查询:获取最新记录姓名为John的ID
PostgreSQL 查询每个id最新记录中name为'John'的条目
需求说明
从包含id、name、date字段的表中,找出**每个id对应的最新记录(按date字段降序)里,name为'John'**的所有条目。
示例数据
| id | name | date |
|---|---|---|
| 1 | 'John' | '2020-01-01' |
| 1 | 'Steve' | '2025-01-01' |
| 2 | 'John' | '2021-01-01' |
| 2 | 'Steve' | '2020-01-01' |
| 3 | 'John' | '2022-01-01' |
| 3 | 'Steve' | '2020-01-01' |
| 4 | 'John' | '2020-01-01' |
| 4 | 'Steve' | '2022-01-01' |
期望结果
| id | name | date |
|---|---|---|
| 2 | 'John' | '2021-01-01' |
| 3 | 'John' | '2022-01-01' |
解决方案
方法1:使用窗口函数(通用型,支持多数数据库)
用ROW_NUMBER()窗口函数给每个id分组内的记录按日期排序,标记出最新的那条,再筛选符合条件的记录:
WITH ranked_records AS ( SELECT id, name, date, -- 按id分组,组内按date降序排序,最新记录序号为1 ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS record_rank FROM your_table_name -- 替换为你的表名 ) SELECT id, name, date FROM ranked_records WHERE record_rank = 1 AND name = 'John';
方法2:使用PostgreSQL专属的DISTINCT ON(更简洁)
PostgreSQL提供的DISTINCT ON语法可以直接获取每个分组的第一条记录,配合排序就能拿到每个id的最新记录,再筛选name条件:
SELECT id, name, date FROM ( -- 按id分组,取每个id的最新记录 SELECT DISTINCT ON (id) id, name, date FROM your_table_name -- 替换为你的表名 ORDER BY id, date DESC ) AS latest_per_id WHERE name = 'John';
说明
- 两种方法都能精准定位到每个id的最新记录,再筛选出name为'John'的条目
- 窗口函数写法更通用,适合需要兼容其他数据库的场景;
DISTINCT ON是PostgreSQL特有的语法,代码更简洁
内容的提问来源于stack exchange,提问作者NoobSailboat
相关产品推荐
相关产品推荐

