Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Obtenha a primeira linha 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

Se você espera 2 entradas por dia, isso escolherá uma arbitrariamente. Para obter as duas entradas de um dia, use DENSE_RANK

Quanto ao normalizado ou não, depende se você deseja:
  • manter o status em 2 lugares
  • preservar o histórico de status
  • ...

Do jeito que está, você preserva o histórico de status. Se você também quiser o status mais recente na tabela pai (que é desnormalização), precisará de um gatilho para manter o "status" no pai. ou elimine esta tabela de histórico de status.