#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