как я могу написать sql-запрос, чтобы получить результирующий набор, получить результирующий набор за максимальное время

#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