SQL Server 2014单查询语句获取最小ProcessStepTwoDtTm及关联字段
实现方式说明
当然可以用单条SELECT语句实现你的需求,而且有几种适合SQL Server 2014的简洁写法,下面给你详细介绍:
方法1:使用TOP 1 WITH TIES(最简洁的单条语句)
这种方式不需要嵌套子查询,直接在主SELECT里就能完成分组取最小行的需求,非常贴合你的场景:
SELECT TOP 1 WITH TIES Id, ProcessStepOneDtTm, ProcessStepTwoStaffId, ProcessStepTwoDtTm FROM YourTableName ORDER BY ROW_NUMBER() OVER(PARTITION BY ProcessStepOneDtTm ORDER BY ProcessStepTwoDtTm ASC)
原理是TOP 1 WITH TIES会返回所有排序后行号为1的记录,刚好对应每个ProcessStepOneDtTm分组里ProcessStepTwoDtTm最小的那一行。
方法2:优化你的子查询写法(依然是单条语句)
你当前的嵌套子查询写法其实已经是单条SELECT语句了,我帮你修正了字段名的小疏漏(原语句里的StaffId应该是ProcessStepTwoStaffId),并调整得更规范:
SELECT Id, ProcessStepOneDtTm, ProcessStepTwoStaffId, ProcessStepTwoDtTm FROM ( SELECT Id, ProcessStepOneDtTm, ProcessStepTwoStaffId, ProcessStepTwoDtTm, ROW_NUMBER() OVER(PARTITION BY ProcessStepOneDtTm ORDER BY ProcessStepTwoDtTm ASC) AS RowNum FROM YourTableName ) AS RankedData WHERE RowNum = 1
这种写法逻辑清晰,适合后续需要扩展复杂排序或过滤规则的场景,同样属于单条SELECT语句的范畴。
方法3:使用关联子查询
另一种单条SELECT的实现方式是用关联子查询匹配分组内最小的ProcessStepTwoDtTm:
SELECT t1.Id, t1.ProcessStepOneDtTm, t1.ProcessStepTwoStaffId, t1.ProcessStepTwoDtTm FROM YourTableName t1 WHERE t1.ProcessStepTwoDtTm = ( SELECT MIN(t2.ProcessStepTwoDtTm) FROM YourTableName t2 WHERE t2.ProcessStepOneDtTm = t1.ProcessStepOneDtTm )
注意:如果同一个ProcessStepOneDtTm分组里存在多个相同的最小ProcessStepTwoDtTm值,这种方式会返回所有匹配的行;而前两种用ROW_NUMBER()的方法只会返回其中一行(如果需要保留所有相同最小值的行,可以把ROW_NUMBER()换成RANK())。
根据你的期望输出,方法1和方法2都能精准得到你想要的结果,其中方法1的写法最为简洁。
内容的提问来源于stack exchange,提问作者user3603308
相关产品推荐
相关产品推荐

