Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ottieni la prima riga di ogni gruppo

;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 ti aspetti 2 voci al giorno, questo ne sceglierà una arbitrariamente. Per ottenere entrambe le voci per un giorno, usa invece DENSE_RANK

Per quanto riguarda la normalizzazione o meno, dipende se vuoi:

  • mantieni lo stato in 2 posizioni
  • conserva la cronologia dello stato
  • ...

Così com'è, conservi la cronologia dello stato. Se vuoi anche lo stato più recente nella tabella padre (che è la denormalizzazione) avresti bisogno di un trigger per mantenere lo "stato" nel genitore. o elimina questa tabella della cronologia dello stato.