You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用窗口函数编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:37:07