sql >> Databasteknik >  >> RDS >> Sqlserver

Få översta raden i varje grupp

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

Om du förväntar dig 2 inlägg per dag, kommer detta godtyckligt att välja en. För att få båda bidragen för en dag, använd DENSE_RANK istället

När det gäller normaliserad eller inte, det beror på om du vill:

  • upprätthålla status på två ställen
  • bevara statushistorik
  • ...

Som det ser ut bevarar du statushistorik. Om du också vill ha den senaste statusen i den överordnade tabellen (vilket är denormalisering) skulle du behöva en trigger för att behålla "status" i föräldern. eller släpp den här statushistoriktabellen.



  1. Reguljärt uttryck i PostgreSQL LIKE-sats

  2. SQL*Plus kör inte SQL-skript som SQL Developer gör

  3. Postgres kunde inte ansluta till servern

  4. Hur skapar man en tillfällig funktion i PostgreSQL?