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;
Mens du taler om "rang", ser du ud til at ønske resultatet af vinduesfunktionen row_number()
.
- Form grupper af på hinanden følgende dage (samme dato i
grp
) i underforespørgselsub
. - Nummerer rækker med en anden
row_number()
opkald, denne gang opdelt afgrp
.
Én underforespørgsel er det absolutte minimum her, da vinduesfunktioner ikke kan indlejres.
Bemærk, at jeg gik med den anden version af dine modstridende eksempeldata. Og resultatet er som @mu foreslået
i sin kommentar.
Også forudsat, at der ikke er dubletdatoer. Du skal først samle dig i dette tilfælde.