Наибольшее-n на группу MSSQL

#sql #sql-server #sql-server-2008 #greatest-n-per-group

#sql #sql-сервер #sql-server-2008 #наибольшее число на группу

Вопрос:

Я использую SQL-server 2008

Моя таблица выглядит так:

 max_period  Employee ID Preferred Name
2016-10-19 00:00:00.000 16317   James Hello
2015-10-31 00:00:00.000 16317   Jimmy Hello
  

Я пытаюсь получить только имя с наибольшим max_period по Employee_ID

вывод будет выглядеть следующим образом:

 max_period  Employee ID Preferred Name
2016-10-19 00:00:00.000 16317   James Hello
  

Кто-нибудь может помочь мне решить эту проблему? Это кажется простым и первым, но вызывает у меня настоящую головную боль.

Комментарии:

1. Используйте RANK или ROW_NUMBER() OVER (PARTITION BY Employee_ID ORDER BY max_period DESC) as r в производной таблице / CTE, а затем фильтруйте WHERE r = 1

Ответ №1:

 ;with cte
AS
(
select max_period  ,EmployeeID , PreferredName, ROW_NUMBER() OVER (PARTITION BY Employee_ID ORDER BY max_period DESC) as RN From Table1
)
SELECT * from cte WHERE RN = 1
  

Вы также можете сделать это с помощью GROUP BY

 select MAX(max_period), EmployeeID , PreferredName FROM Table1 GROUP BY EmployeeID , PreferredName 
  

Ответ №2:

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

 ;with cte as (
  select *, RowN = row_number() over (order by max_Period desc) from YourTable
 ) select * from cte where RowN = 1
  

Ответ №3:

 SELECT *
  FROM (SELECT max(period) as max_period, [Employee ID], [Preferred Name],
           ROW_NUMBER() OVER (PARTITION BY [Employee ID] ORDER BY period DESC)     rank
          FROM STG.tbl_HR_BI_feed
      where [Employee ID] = '16317'
      group by [Employee ID], [Preferred Name], period) a
 WHERE a.rank = 1