Question

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  

J'aimerais interroger les données et renvoyer le statut le plus récent pour chaque utilisateur. Dans ce cas, ma requête renverrait 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  

J'essaie de comprendre TRANSACT-SQL pour que cela se produise? Toute aide serait la bienvenue.

Était-ce utile?

La solution

Agrégez-vous dans une table dérivée sous-requête , puis rejoignez-la.

 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 

Autres conseils

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

uniquement SQL Server 2005 et versions ultérieures

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;

La table dérivée fonctionnerait, mais s'il s'agissait de SQL 2005, un CTE et un ROW_NUMBER pourraient ê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

Ceci faciliterait également l'affichage des derniers états x de chaque utilisateur.

Un autre moyen simple:

SELECT Date, User, Status, Notes  
FROM Test_Most_Recent 
WHERE Date in ( SELECT MAX(Date) from Test_Most_Recent group by User)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top