web-dev-qa-db-fra.com

Créer une requête SQL pour récupérer les enregistrements les plus récents

Je crée un module de tableau de statut pour mon équipe de projet. La carte d'état permet à l'utilisateur de définir son statut d'entrée ou de sortie et peut également fournir une note. Je prévoyais de stocker toutes les informations dans une seule table ... et voici un exemple de données:

Date               User         Status    Notes
-------------------------------------------------------
1/8/2009 12:00pm   B.Sisko      In        Out to lunch    
1/8/2009 8:00am    B.Sisko      In  
1/7/2009 5:00pm    B.Sisko      In    
1/7/2009 8:00am    B.Sisko      In    
1/7/2009 8:00am    K.Janeway    In   
1/5/2009 8:00am    K.Janeway    In    
1/1/2009 8:00am    J.Picard     Out       Vacation  

Je souhaite interroger les données et renvoyer le statut le plus récent pour chaque utilisateur. Dans ce cas, ma requête renvoie les résultats suivants:

Date               User         Status    Notes
-------------------------------------------------------  
1/8/2009 12:00pm   B.Sisko      In        Out to lunch    
1/7/2009 8:00am    K.Janeway    In   
1/1/2009 8:00am    J.Picard     Out       Vacation  

Je suis essayer de comprendre le TRANSACT-SQL pour y arriver? Toute aide serait appréciée.

56
mattruma

Agrégé dans un sous-requête table dérivée et ensuite rejoindre à elle.

 Select Date, User, Status, Notes 
    from [SOMETABLE]
    inner join 
    (
        Select max(Date) as LatestDate, [User]
        from [SOMETABLE]
        Group by User
    ) SubMax 
    on [SOMETABLE].Date = SubMax.LatestDate
    and [SOMETABLE].User = SubMax.User 
73
cmsjr

autrement, cela n’analysera la table qu’une fois au lieu de deux si vous utilisez une sous-requête

uniquement serveur SQL 2005 et plus

select Date, User, Status, Notes 
from (
       select m.*, row_number() over (partition by user order by Date desc) as rn
       from [SOMETABLE] m
     ) m2
where m2.rn = 1;
59
SQLMenace

La table dérivée fonctionnerait, mais s'il s'agit de SQL 2005, un CTE et ROW_NUMBER peuvent être plus propres:

WITH UserStatus (User, Date, Status, Notes, Ord)
as
(
SELECT Date, User, Status, Notes, 
     ROW_NUMBER() OVER (PARTITION BY User ORDER BY Date DESC)
FROM [SOMETABLE]
)

SELECT User, Date, Status, Notes from UserStatus where Ord = 1

Cela faciliterait également l'affichage des états x les plus récents de chaque utilisateur.

9
Ira Pfeifer

Un autre moyen facile:

SELECT Date, User, Status, Notes  
FROM Test_Most_Recent 
WHERE Date in ( SELECT MAX(Date) from Test_Most_Recent group by User)
5
Mahesh RG