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.