SQL Как вернуть запись с самой последней датой, а также с самым высоким значением int - PullRequest
0 голосов
/ 10 сентября 2018

Я должен вернуть самую последнюю строку в базе данных SQL, сгруппированную по CallID. «Самый последний» в этом случае означает самую последнюю дату отправления и самое высокое время отправления (int) на эту дату. Ниже приведен пример для справки:

set dateformat dmy
create table #Temp
(
Callid nvarchar(6), 
Linenum nVarchar(6), 
Engineerid nvarchar (4), 
Departuredate DateTime, 
Departuretime int
)
insert into #Temp 
Values (
'100000','1','AToo','05/09/2017','57896'),
('100000','1.5','DBok','05/09/2017','57898'),
('100000','1.75','DBok','05/09/2017','57895'),
('100000','2','GKar','04/09/2017','59805'),
('100000','3','ALee','05/09/2017','54895'),
('100001','1','GKar','08/09/2017','54000'),
('100001','2','GKar','08/09/2017','58895'),
('100001','2.25','ALee','08/09/2017','56875'),
('100001','2.5','DBok','07/09/2017','59000')

select * from #Temp
drop table #Temp

То, что я хочу вернуть за вышесказанное, это две следующие записи:

CallID  Linenum  Engineerid  Departuredate  Departuretime
100000  1.5      DBok        05/09/2017     57898
100001  2        GKar        08/09/2017     58895

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы можете использовать трюк с TOP 1 WITH TIES

select TOP 1 WITH TIES * 
from #Temp
ORDER BY ROW_NUMBER() OVER (PARTITION BY CallId ORDER BY Departuredate DESC,Departuretime DESC);

ORDER BY ROW_NUMBER() OVER(PARTITION BY CallId...) перезапустит нумерацию строк для каждого CallId. Таким образом, есть много строк с 1, отмечающими наивысший . TOP 1 выберет только первую строку набора результатов, но с WITH TIES он вернет все первые строки, если их более одной.

0 голосов
/ 10 сентября 2018

Вы можете использовать оконную функцию row_number, чтобы упорядочить записи по callid, а затем просто взять первое:

SELECT CallID, Linenum, Engineerid, Departuredate, Departuretime
FROM   (SELECT CallID, Linenum, Engineerid, Departuredate, Departuretime,
               ROW_NUMBER() OVER (PARTITION BY CallID
                                  ORDER BY Departuredate DESC, Departuretime DESC) AS rn
        FROM   #Temp) t
WHERE  rn = 1
...