sql >> Base de Datos >  >> RDS >> Sqlserver

Obtenga la primera fila de cada grupo

;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 espera 2 entradas por día, entonces elegirá una arbitrariamente. Para obtener ambas entradas para un día, use DENSE_RANK en su lugar

En cuanto a normalizarse o no, depende de si quieres:

  • mantener el estado en 2 lugares
  • preservar el historial de estado
  • ...

Tal como está, conservas el historial de estado. Si también desea el estado más reciente en la tabla principal (que es la desnormalización), necesitará un disparador para mantener el "estado" en la tabla principal. o suelte esta tabla de historial de estado.