在一个select语句选择最小日期和相关领域

问题描述 投票:0回答:2

我想选择最小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语句来做到这一点?

sql sql-server-2014
2个回答
0
投票

您可以使用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)的索引。


0
投票

您可以使用下面一行查询

select Id, min(ProcessStepOneDtTm), StaffId, min(ProcessStepTwoDtTm) group by ID, StaffId
© www.soinside.com 2019 - 2024. All rights reserved.