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;
Mentre parli di "rank" sembra che tu voglia il risultato della funzione della finestra row_number()
.
- Forma gruppi di giorni consecutivi (stessa data in
grp
) nella sottoquerysub
. - Numero di righe con un altro
row_number()
chiamata, questa volta partizionata dagrp
.
Una sottoquery qui è il minimo indispensabile, poiché le funzioni della finestra non possono essere nidificate.
Nota che sono andato con la seconda versione dei tuoi dati campione contraddittori. E il risultato è come @mu suggerito
nel suo commento.
Supponendo anche che non ci siano date duplicate. In questo caso dovresti prima aggregare.