Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir la première ligne de chaque groupe

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

Si vous vous attendez à 2 entrées par jour, cela en choisira une arbitrairement. Pour obtenir les deux entrées pour une journée, utilisez DENSE_RANK à la place

Normalisé ou non, cela dépend si vous voulez :

  • maintenir le statut à 2 endroits
  • préserver l'historique des statuts
  • ...

Dans l'état actuel des choses, vous conservez l'historique des statuts. Si vous voulez également le dernier statut dans la table parent (ce qui est une dénormalisation), vous aurez besoin d'un déclencheur pour maintenir le "statut" dans le parent. ou supprimez cette table d'historique d'état.