365 votes

comment faire une requête sql pour une dernière date d'enregistrement pour chaque utilisateur

J'ai une table qui est une collection d'entrées que lorsqu'un utilisateur est connecté.

username, date,      value
--------------------------
brad,     1/2/2010,  1.1
fred,     1/3/2010,  1.0
bob,      8/4/2009,  1.5
brad,     2/2/2010,  1.2
fred,     12/2/2009, 1.3

etc..

Comment puis-je créer une requête qui pourrait me donner la date la plus récente pour chaque utilisateur?

Mise à jour: j'ai oublié que je devais avoir une valeur qui va de pair avec la date la plus récente.

562voto

RedFilter Points 84190
select t.username, t.date, t.value
from MyTable t
inner join (
    select username, max(date) as MaxDate
    from MyTable
    group by username
) tm on t.username = tm.username and t.date = tm.MaxDate

208voto

dotjoe Points 11959

SQL Server 2005 et jusqu'à...

select * from (
    select
        username,
        date,
        value,
        row_number() over(partition by username order by date desc) as rn
    from
        yourtable
) t
where t.rn = 1

30voto

Alison R. Points 2674

Pour obtenir l'ensemble de la ligne contenant le max date pour l'utilisateur:

select username, date, value
from tablename where (username, date) in (
    select username, max(date) as date
    from tablename
    group by username
)

12voto

Manix Points 1
SELECT *     
FROM MyTable T1    
WHERE date = (
   SELECT max(date)
   FROM MyTable T2
   WHERE T1.username=T2.username
)

3voto

Peter Lang Points 25877

Celui-ci devrait vous donner le résultat correct pour votre édité question.

La sous-requête permet de s'assurer de trouver uniquement les lignes de la date la plus récente, et que l'extérieur de la GROUP BY prendra soin de liens. Lorsqu'il y a deux entrées pour le même jour pour le même utilisateur, il sera de retour le plus value.

SELECT t.username, t.date, MAX( t.value ) value
FROM your_table t
JOIN (
       SELECT username, MAX( date ) date
       FROM your_table
       GROUP BY username
) x ON ( x.username = t.username AND x.date = t.date )
GROUP BY t.username, t.date

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X