PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rang basierend auf der Folge von Daten

SELECT heading, thedate
      ,row_number() OVER (PARTITION BY grp ORDER BY thedate) AS rn
FROM  (
   SELECT *, thedate - (row_number() OVER (ORDER BY thedate))::int AS grp
   FROM   demo
   ) sub;

Während Sie von "Rang" sprechen, wollen Sie anscheinend das Ergebnis der Fensterfunktion row_number() .

  1. Bilden Sie Gruppen aufeinanderfolgender Tage (gleiches Datum in grp ) in der Unterabfrage sub .
  2. Nummeriere Zeilen mit einer anderen row_number() aufrufen, diesmal partitioniert durch grp .

Eine Unterabfrage ist hier das absolute Minimum, da Fensterfunktionen nicht verschachtelt werden können.

SQL-Fiddle.

Beachten Sie, dass ich mich für die zweite Version Ihrer widersprüchlichen Beispieldaten entschieden habe. Und das Ergebnis ist wie @mu vorgeschlagen in seinem Kommentar.
Unter der Annahme, dass es keine doppelten Daten gibt. In diesem Fall müssten Sie zuerst aggregieren.