SQL多表关联按时间戳获取指定列唯一值最新行问题
问题排查与解决方案
你的代码有两个关键问题导致无法得到预期结果:
TOP 1是全局范围限制
原代码里的TOP 1会从所有符合条件的结果中只取排序后的第一行——也就是全局最新的那一条,而非每个Flow.Code分组下的最新行。IN子句的字符串值未加单引号
你写的IN (BLV-PF-2, CA-ARK-CH-PF, CA COS-AU-EN-AU-PF)里的Code是字符串,必须用单引号包裹,否则数据库会把它们识别为列名,直接运行会报语法错误。
修正后的代码(分组取最新)
用ROW_NUMBER()窗口函数按Flow.Code分组,每组内按ModifiedAt倒序排名,再筛选出每组的第一行即可:
WITH RankedOperations AS ( SELECT f.id AS FlowId, f.code AS FlowCode, o.id AS OperationId, o.Flowid, o.Status, o.createdat, o.modifiedat, o.errormessage, -- 按FlowCode分组,组内按修改时间倒序排名 ROW_NUMBER() OVER (PARTITION BY f.code ORDER BY o.ModifiedAt DESC) AS rn FROM dbo.Flow f JOIN dbo.Operation o ON f.Id = o.FlowId WHERE f.Code IN ('BLV-PF-2', 'CA-ARK-CH-PF', 'CA COS-AU-EN-AU-PF') ) SELECT FlowId, FlowCode, OperationId, Flowid, Status, createdat, modifiedat, errormessage FROM RankedOperations WHERE rn = 1;
代码说明
PARTITION BY f.code:把结果按Flow.Code拆分成独立的分组ORDER BY o.ModifiedAt DESC:每个分组内按操作的修改时间从新到旧排序rn = 1:只保留每个分组里排名第一的行,也就是该Code对应的最新操作数据
内容的提问来源于stack exchange,提问作者MADDURI NAGA SRAVYA
相关产品推荐
相关产品推荐

