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.
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
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;
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.
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)