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;
Докато говорите за "ранг", изглежда, че искате резултата от функцията прозорец row_number()
.
- Формирайте групи от последователни дни (една и съща дата в
grp
) в подзаявкаsub
. - Номерирайте редове с друг
row_number()
повикване, този път разделено отgrp
.
Една подзаявка е минимумът тук, тъй като прозоречните функции не могат да бъдат вложени.
Обърнете внимание, че използвах втората версия на вашите противоречиви примерни данни. И резултатът е както @mu предложи
в неговия коментар.
Също така ако приемем, че няма дублирани дати. В този случай първо трябва да съберете.