如何使用SQL获取每个_id对应最新updatedAtDate的数据集?
获取每个_id对应最新updatedAtDate的所有记录
原始数据表
| _id | updatedAtDate |
|---|---|
| ab | 2023-02-25 02:43:49 |
| ab | 2023-02-25 02:43:49 |
| ac | 2023-06-25 02:43:49 |
| ab | 2023-02-22 03:43:49 |
| ac | 2023-06-25 02:43:49 |
| ac | 2023-12-25 02:43:49 |
预期结果
| _id | updatedAtDate |
|---|---|
| ab | 2023-02-25 02:43:49 |
| ab | 2023-02-25 02:43:49 |
| ac | 2023-06-25 02:43:49 |
| ac | 2023-06-25 02:43:49 |
方法1:子查询匹配最大日期(兼容所有主流SQL数据库)
通过子查询先按_id分组找出每个分组的最新日期,再关联原表筛选出对应记录:
SELECT t1._id, t1.updatedAtDate FROM your_table t1 INNER JOIN ( SELECT _id, MAX(updatedAtDate) AS max_date FROM your_table GROUP BY _id ) t2 ON t1._id = t2._id AND t1.updatedAtDate = t2.max_date;
方法2:窗口函数(适用于支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL、SQL Server等)
用RANK()窗口函数给每个_id分组内的记录按日期倒序排名,筛选排名为1的记录(保留所有同日期的最新记录):
SELECT _id, updatedAtDate FROM ( SELECT _id, updatedAtDate, RANK() OVER (PARTITION BY _id ORDER BY updatedAtDate DESC) AS rnk FROM your_table ) sub WHERE rnk = 1;
注意:这里使用
RANK()而非ROW_NUMBER(),是因为当同一_id存在多条相同最新日期的记录时,RANK()会保留所有这些记录,符合需求;若用ROW_NUMBER()会给每条记录分配唯一序号,可能只返回一条,不符合预期。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

