SQL查询:提取表中每个col2(产品编号)对应的最新时间戳数据行
需求背景
现有存储产品多条录入数据的业务表,可参考如下语句创建测试表:
CREATE TABLE test( [coltimestamp] [datetime] NOT NULL, [col2] [int] NOT NULL, [col3] [int] NULL, [col4] [int] NULL, [col5] [int] NULL) GO Insert Into test values ('2021-12-06 12:31:59.000',1,8,5321,1234), ('2021-12-06 12:31:59.000',7,8,4047,1111), ('2021-12-06 14:38:07.000',7,8,3521,1111), ('2021-12-06 12:31:59.000',10,8,3239,1234), ('2021-12-06 12:31:59.000',27,8,3804,1234), ('2021-12-06 14:38:07.000',27,8,3957,1234)
其中col2为产品编号,需要实现查询逻辑:对col2去重,仅保留每个产品对应coltimestamp最新的录入行,过滤同产品的旧时间戳条目。测试数据执行后预期返回4行,过滤掉col2=7、col2=27的旧时间戳记录。
实现SQL
方案1:窗口函数法(兼容SQL Server、MySQL 8.0+、PostgreSQL、Oracle等主流新数据库)
WITH ranked_data AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY col2 ORDER BY coltimestamp DESC) AS rn FROM test ) SELECT coltimestamp, col2, col3, col4, col5 FROM ranked_data WHERE rn = 1;
逻辑说明:按产品编号col2分组,组内按时间戳倒序排序,每组排名为1的就是该产品最新的录入记录。
方案2:子查询关联法(兼容低版本数据库,例如MySQL 5.x)
SELECT t1.* FROM test t1 INNER JOIN ( SELECT col2, MAX(coltimestamp) AS max_ts FROM test GROUP BY col2 ) t2 ON t1.col2 = t2.col2 AND t1.coltimestamp = t2.max_ts;
逻辑说明:先分组查询每个产品的最新时间戳,再和原表关联匹配出对应完整行数据。
内容的提问来源于stack exchange,提问作者user16025262
相关产品推荐
相关产品推荐

