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;
Pendant que vous parlez de "rang" vous semblez vouloir le résultat de la fonction window row_number()
.
- Former des groupes de jours consécutifs (même date en
grp
) dans la sous-requêtesub
. - Numéroter les lignes avec un autre
row_number()
appel, cette fois partitionné pargrp
.
Une sous-requête est le strict minimum ici, car les fonctions de fenêtre ne peuvent pas être imbriquées.
Notez que je suis allé avec la deuxième version de vos données d'échantillon contradictoires. Et le résultat est comme @mu suggéré
dans son commentaire.
En supposant également qu'il n'y a pas de dates en double. Dans ce cas, vous devez d'abord agréger.