#sql #sql-server
#sql #sql-server
Вопрос:
Name Longititue latutute Time
tharindu 79.94148 6.9748404 00:15:47
shane 79.8630765 6.8910388 13:23:24
shane 79.862815 6.8909349 14:41:29
shane 79.8628665 6.8911084 09:39:33
shane 79.8626956 6.890992 11:00:07
shane 79.8628831 6.89099 11:43:00
я хочу получить результирующий набор, как показано ниже
shane 79.862815 6.8909349 14:41:29
tharindu 79.94148 6.9748404 00:15:47
как я могу написать sql-запрос, чтобы получить результирующий набор, получить результирующий набор за максимальное время
Ответ №1:
Вы можете попробовать использовать ROW_NUMBER
функцию window.
SELECT Name,Longititue,latutute,[Time]
FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY [Time] DESC) rn
FROM T
)t1
WHERE rn = 1
Ответ №2:
вы также можете попробовать использовать коррелированный подзапрос
select * from tablename a
where Time in (select max(Time) from tablename b where a.name=b.name)
Ответ №3:
вы можете использовать связанный с corelated подзапрос
select t.* from table_name t
where t.[Time]=( select max([Time]) from table_name t1 where t1.Name=t.Name)
Ответ №4:
Вот способ использования ROW_NUMBER
без формального подзапроса:
SELECT TOP 1 WITH TIES
Name,
Longititue,
latutute,
Time
FROM yourTable
ORDER BY
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY [Time] DESC);
ДЕМОНСТРАЦИЯ
Ответ №5:
Вы можете достичь этого с помощью CTE (Common Table Expression) и функции ранжирования.
SQL-запрос:
WITH CTE AS
(
SELECT Name,Longititue,latutute,Time,DENSE_RANK() OVER(PARTITION BY Name ORDER BY time desc) as RN
FROM MaxTime
)
SELECT * FROM CTE
WHERE RN = 1