如何使用窗口函数编写SQL查询获取各ID最新时间戳记录?
用窗口函数获取各唯一ID的最新时间戳记录
假设你的表名为your_table,ID字段为id,时间戳字段为timestamp_col,还有其他业务字段(如col1、col2)。可以通过以下方式用窗口函数实现需求:
基础方案(取单条最新记录)
使用ROW_NUMBER()窗口函数,按ID分组后按时间戳倒序排序,筛选出行号为1的记录:
SELECT id, timestamp_col, col1, col2 -- 替换为你需要查询的实际字段 FROM ( SELECT id, timestamp_col, col1, col2, -- 按ID分组,组内按时间戳降序分配行号 ROW_NUMBER() OVER (PARTITION BY id ORDER BY timestamp_col DESC) AS row_num FROM your_table -- 替换为你的表名 ) AS ranked_records WHERE row_num = 1;
代码说明
PARTITION BY id:将数据按ID拆分独立分组,每个ID的记录单独计算行号ORDER BY timestamp_col DESC:在每个ID组内,按时间戳从最新到最旧排序ROW_NUMBER():为每组内的记录生成连续行号,最新的记录行号为1- 外层查询通过
row_num = 1筛选出每个ID的唯一最新记录
扩展方案(保留所有同时间戳的最新记录)
如果存在多个记录时间戳完全相同且均为最新的情况,用RANK()或DENSE_RANK()替代ROW_NUMBER(),可保留所有符合条件的记录:
SELECT id, timestamp_col, col1, col2 FROM ( SELECT id, timestamp_col, col1, col2, -- 同时间戳的记录会获得相同排名 RANK() OVER (PARTITION BY id ORDER BY timestamp_col DESC) AS rank_num FROM your_table ) AS ranked_records WHERE rank_num = 1;
区别说明
ROW_NUMBER():即使时间戳相同,也会生成不同行号,最终只返回一条记录RANK():同时间戳的记录共享相同排名,会返回所有最新时间戳的记录
内容的提问来源于stack exchange,提问作者Oliwier Mroczkowski
相关产品推荐
相关产品推荐

