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

如何基于最新Timestamp和Product ID筛选数据表的最新记录?

获取每个Product ID的最新时间记录的解决方案

以下是几种通用的SQL解决方案,适用于大多数主流数据库(MySQL、PostgreSQL、SQL Server等):

方法1:窗口函数(推荐,灵活且易维护)

利用ROW_NUMBER()(或RANK()/DENSE_RANK())窗口函数对每个Product ID的记录按时间倒序排名,取排名第一的记录:

WITH ranked_records AS (
    SELECT 
        *,
        -- 按Product ID分组,时间最新的排第1
        ROW_NUMBER() OVER (PARTITION BY `Product ID` ORDER BY `Timestamp` DESC) AS record_rank
    FROM your_table_name
)
SELECT Timestamp, `Product ID`, `Column A`, `Column B`
FROM ranked_records
WHERE record_rank = 1;
  • 注意:如果同一Product ID存在多条相同最新时间的记录,ROW_NUMBER()只会保留其中一条;若要保留所有同时间的记录,将ROW_NUMBER()替换为RANK()或DENSE_RANK()即可。

方法2:子查询关联(兼容老版本数据库)

先通过子查询获取每个Product ID的最新时间,再与原表关联匹配完整记录:

SELECT t1.*
FROM your_table_name t1
INNER JOIN (
    -- 先找出每个Product ID的最大时间戳
    SELECT `Product ID`, MAX(`Timestamp`) AS latest_ts
    FROM your_table_name
    GROUP BY `Product ID`
) t2 ON t1.`Product ID` = t2.`Product ID` AND t1.`Timestamp` = t2.latest_ts;

这种方法会自动保留同一Product ID下所有最新时间的记录,适合不支持窗口函数的数据库版本。

方法3:IN子句筛选(简洁写法)

直接通过子查询生成的「Product ID+最新时间」对来筛选原表记录:

SELECT *
FROM your_table_name
WHERE (`Product ID`, `Timestamp`) IN (
    SELECT `Product ID`, MAX(`Timestamp`)
    FROM your_table_name
    GROUP BY `Product ID`
);

逻辑和方法2一致,写法更简洁,但大表查询时性能可能略低于关联写法。

补充说明

  • 单独使用MAX(Timestamp)只能得到每个Product ID的最大时间值,无法关联到对应行的其他列,因此需要结合子查询或窗口函数来获取完整记录;
  • DISTINCT是基于整行所有字段的唯一性去重,只要某列值不同就会保留,所以无法满足「按Product ID取最新记录」的需求。

内容的提问来源于stack exchange,提问作者Daniel Traub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:42:12