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.