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()
.
- Bilden Sie Gruppen aufeinanderfolgender Tage (gleiches Datum in
grp
) in der Unterabfragesub
. - Nummeriere Zeilen mit einer anderen
row_number()
aufrufen, diesmal partitioniert durchgrp
.
Eine Unterabfrage ist hier das absolute Minimum, da Fensterfunktionen nicht verschachtelt werden können.
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.