Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Holen Sie sich die oberste 1-Reihe jeder Gruppe

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
   FROM DocumentStatusLogs
)
SELECT *
FROM cte
WHERE rn = 1

Wenn Sie 2 Einträge pro Tag erwarten, wird dieser willkürlich einen auswählen. Um beide Einträge für einen Tag zu erhalten, verwenden Sie stattdessen DENSE_RANK

Ob normalisiert oder nicht, es hängt davon ab, ob Sie Folgendes möchten:

  • Status an 2 Stellen beibehalten
  • Statusverlauf beibehalten
  • ...

So wie es aussieht, bewahren Sie den Statusverlauf auf. Wenn Sie den neuesten Status auch in der übergeordneten Tabelle wünschen (was eine Denormalisierung ist), benötigen Sie einen Trigger, um den "Status" in der übergeordneten Tabelle beizubehalten. oder löschen Sie diese Statusverlaufstabelle.