如何基于最新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
相关产品推荐
相关产品推荐

