Ich erstelle ein Statusboard-Modul für mein Projektteam. Über die Statusanzeige kann der Benutzer seinen Status als "Ein" oder "Aus" festlegen und eine Notiz bereitstellen. Ich hatte vor, alle Informationen in einer einzigen Tabelle zu speichern ... und ein Beispiel für die Daten folgt:
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
Ich möchte die Daten abfragen und den neuesten Status für jeden Benutzer zurückgeben. In diesem Fall würde meine Abfrage die folgenden Ergebnisse zurückgeben:
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
Ich versuche, TRANSACT-SQL herauszufinden, um dies zu ermöglichen. Jede Hilfe wäre dankbar.
sql
tsql
derived-table
Mattruma
quelle
quelle
Auf andere Weise wird die Tabelle nur einmal anstatt zweimal gescannt, wenn Sie eine Unterabfrage verwenden
Nur SQL Server 2005 und höher
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;
quelle
Die abgeleitete Tabelle würde funktionieren, aber wenn dies SQL 2005 ist, könnten ein CTE und ROW_NUMBER sauberer sein:
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
Dies würde auch die Anzeige der neuesten x-Status von jedem Benutzer erleichtern.
quelle
Ein weiterer einfacher Weg:
SELECT Date, User, Status, Notes FROM Test_Most_Recent WHERE Date in ( SELECT MAX(Date) from Test_Most_Recent group by User)
quelle
Fügen Sie jedem Datensatz einen automatisch inkrementierenden Primärschlüssel hinzu, z. B. UserStatusId.
Dann könnte Ihre Anfrage so aussehen:
select * from UserStatus where UserStatusId in ( select max(UserStatusId) from UserStatus group by User )
Datum Benutzerstatus Hinweise
quelle