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