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;
Enquanto você fala de "rank", você parece querer o resultado da função window
row_number()
. - Forma grupos de dias consecutivos (mesma data em
grp
) na subconsultasub
. - Número de linhas com outro
row_number()
chamada, desta vez particionada porgrp
.
Uma subconsulta é o mínimo aqui, pois as funções da janela não podem ser aninhadas.
SQL Fiddle.
Observe que eu fui com a segunda versão de seus dados de amostra contraditórios. E o resultado é como @mu sugerido em seu comentário.
Assumindo também que não há datas duplicadas. Você teria que agregar primeiro neste caso.