sql >> Database >  >> RDS >> Sqlserver

Haal de bovenste 1 rij van elke groep

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
   FROM DocumentStatusLogs
)
SELECT *
FROM cte
WHERE rn = 1

Als u 2 inzendingen per dag verwacht, wordt er willekeurig een gekozen. Gebruik in plaats daarvan DENSE_RANK

. om beide vermeldingen voor een dag te krijgen

Genormaliseerd of niet, het hangt ervan af of je het volgende wilt:

  • status behouden op 2 plaatsen
  • statusgeschiedenis behouden
  • ...

Zoals het er nu uitziet, bewaart u de statusgeschiedenis. Als je ook de laatste status in de bovenliggende tabel wilt (wat denormalisatie is), heb je een trigger nodig om de "status" in de bovenliggende tabel te behouden. of laat deze statusgeschiedenistabel vallen.



  1. Een lijst met gegevenstypen retourneren in SQL Server (T-SQL)

  2. CAST() versus TRY_CAST() in SQL Server:wat is het verschil?

  3. Verwijder ouder als er niet naar verwezen wordt door een ander kind

  4. Waarom Select Top 100 Percent gebruiken?