Выберите минимальную дату и связанные поля в одном операторе выбора - PullRequest
0 голосов
/ 09 февраля 2019

Я хотел бы выбрать минимальный ProcessStepTwoDtTm и связанный с ним ProcessStepTwoStaffId, но хотите знать, возможно ли это сделать в одном операторе выбора?Я использую 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?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Вы можете использовать ниже однострочный запрос

select Id, min(ProcessStepOneDtTm), StaffId, min(ProcessStepTwoDtTm) group by ID, StaffId
0 голосов
/ 09 февраля 2019

Вы можете использовать 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).

...