PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Classifica in base alla sequenza di date

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() .

  1. Forma gruppi di giorni consecutivi (stessa data in grp ) nella sottoquery sub .
  2. Numero di righe con un altro row_number() chiamata, questa volta partizionata da grp .

Una sottoquery qui è il minimo indispensabile, poiché le funzioni della finestra non possono essere nidificate.

SQL Fiddle.

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.