Obtenir la première ligne de chaque groupe

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 attendez 2 entrées par jour, alors cela en choisira une de manière arbitraire. Pour obtenir les deux entrées d’un jour, utilisez DENSE_RANK au lieu de ROW_NUMBER.

Quant à savoir si c’est normalisé ou non, cela dépend de si vous souhaitez :

  • maintenir le statut à 2 endroits

  • préserver l’historique des statuts

En l’état, vous préservez l’historique des statuts. Si vous souhaitez aussi le dernier statut dans la table parente (ce qui est de la dénormalisation), vous auriez besoin d’un déclencheur pour maintenir le « statut » dans la table parente. Ou bien supprimer cette table d’historique des statuts.