Выберите отдельную первую запись по дате

#sql #sql-server #select

#sql #sql-сервер #выберите

Вопрос:

Я пишу скрипт для сравнения программного обеспечения между серверами, но у меня ситуация с отношениями «многие ко многим», чтобы выполнить это чисто. Я думаю, что запрос типа distinct-top по последней дате может помочь. Чтобы я мог перейти от этого

введите описание изображения здесь

К этому сокращенному и чистому списку

введите описание изображения здесь

Я не совсем уверен, как подойти к этому? Должен ли я начать с сортировки, а затем выделить top distinct по дате?

Ответ №1:

Вы также можете попробовать использовать row_number()

 select * from
(
select *, row_number() over(partition by software_list order by date desc) as rn
from tablename
)A where rn=1
  

Ответ №2:

Как насчет коррелированного подзапроса?

 select t.*
from t t2
where t.date = (select max(t2.date) from t t2 where t2.software_list = t.software_list);
  

Ответ №3:

Вот другой способ, использующий LAST_VALUE. Работает без подзапроса

Данные

 drop table if exists #tTEST;
go
select * INTO #tTEST from (values 
('Software1', '1.0.0.1', '1900-01-01'),
('Software1', '1.1.1.1', '2020-03-04'),
('Software2', '3.2.2.1', '1900-01-01'),
('Software2', '3.3.3.1', '2020-03-04'),
('Software2', '4.5.0.0', '2020-05-07')) V(Software_List, [Version], [Date]);
  

Запрос

 select distinct Software_List, 
       last_value([Version]) over (partition by Software_List order by [Date]
       rows between unbounded preceding and unbounded following) [Version],
       last_value([Date]) over (partition by Software_List order by [Date]
       rows between unbounded preceding and unbounded following) [Date]
from #tTEST t;
  

Результаты

 Software_List   Version Date
Software1       1.1.1.1 2020-03-04
Software2       4.5.0.0 2020-05-07