SQL Server: select distinct par une colonne et par une autre valeur de colonne

Ceci est une donnée de la table SQL Server

id user_id start_date status_id payment_id ====================================================== 2 4 20-nov-11 1 5 3 5 23-nov-11 1 245 4 5 25-nov-11 1 128 5 6 20-nov-11 1 223 6 6 25-nov-11 2 542 7 4 29-nov-11 2 123 8 4 05-jan-12 2 875 

J'ai besoin d'avoir des valeurs distinctes par user_id également order by id asc , mais seulement un user_id avec le plus haut start_date

J'ai besoin de la sortie suivante:

 id user_id start_date status_id payment_id ====================================================== 8 4 05-jan-12 2 875 4 5 25-nov-11 1 128 6 6 25-nov-11 2 542 

S'il vous plaît aider!

Quelle est la requête SQL pour cela?

Vous pouvez utiliser row_number() dans une sous-requête ou en utilisant CTE.

Version de sous-requête:

 select id, user_id, start_date, status_id, payment_id from ( select id, user_id, start_date, status_id, payment_id, row_number() over(partition by user_id order by start_date desc) rn from yourtable ) src where rn = 1 

Voir SQL Fiddle avec démo

Version CTE:

 ;with cte as ( select id, user_id, start_date, status_id, payment_id, row_number() over(partition by user_id order by start_date desc) rn from yourtable ) select id, user_id, start_date, status_id, payment_id from cte where rn = 1 

Voir SQL Fiddle avec démo

Ou vous pouvez join la table à elle-même:

 select t1.id, t1.user_id, t1.start_date, t1.status_id, t1.payment_id from yourtable t1 inner join ( select user_id, max(start_date) start_date from yourtable group by user_id ) t2 on t1.user_id = t2.user_id and t1.start_date = t2.start_date 

Voir SQL Fiddle avec démo

Toutes les requêtes produiront le même résultat:

 | ID | USER_ID | START_DATE | STATUS_ID | PAYMENT_ID | --------------------------------------------------------------------------- | 8 | 4 | January, 05 2012 00:00:00+0000 | 2 | 875 | | 4 | 5 | November, 25 2011 00:00:00+0000 | 1 | 128 | | 6 | 6 | November, 25 2011 00:00:00+0000 | 2 | 542 | 

Pas le meilleur et non testé:

 select * from ServersTable join ( select User_Id, max(Id) as ID from ServersTable x where x.start_date = ( select max(start_date) from ServersTable y where y.UserID = x.UserId ) group by User_Id) s on ServersTable.Id = s.Id