我想选择最小ProcessStepTwoDtTm和相关ProcessStepTwoStaffId,但想知道是否可以这样做在一个单一的select语句?我使用SQL Server 2014
数据集
Id ProcessStepOneDtTm ProcessStepTwoStaffId ProcessStepTwoDtTm
1 2/2/2019 615 4/2/2019
2 2/2/2019 232 5/2/2019
所需的输出
Id ProcessStepOneDtTm ProcessStepTwoStaffId ProcessStepTwoDtTm
1 2/2/2019 615 4/2/2019
目前,我有:
SELECT *
FROM
(
SELECT Id
, ProcessStepOneDtTm
, StaffId
, ProcessStepTwoDtTm
, ROW_NUMBER() OVER(PARTITION BY ProcessStepOneDtTm ORDER BY
ProcessStepTwoDtTm) as RowNum
)
WHERE RowNum = 1
有没有办法在一个SELECT语句来做到这一点?
您可以使用top with ties
:
SELECT TOP (1) WITH TIES . . .
FROM ?
ORDER BY ROW_NUMBER() OVER (PARTITION BY ProcessStepOneDtTm ORDER BY ProcessStepTwoDtTm)
我觉得这个性能比你的情况更糟糕一点。为了获得最佳性能,相关子查询往往效果最好:
select t.*
from t
where t.ProcessStepTwoDtTm = (select min(t2.ProcessStepTwoDtTm)
from t t2
where t2.ProcessStepOneDtTm = t.ProcessStepOneDtTm
);
出于性能,你需要(ProcessStepOneDtTm, ProcessStepTwoDtTm)
的索引。
您可以使用下面一行查询
select Id, min(ProcessStepOneDtTm), StaffId, min(ProcessStepTwoDtTm) group by ID, StaffId