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;
Mówiąc o „rankingu”, wydaje się, że chcesz otrzymać wynik funkcji okna row_number()
.
- Utwórz grupy kolejnych dni (ta sama data w
grp
) w podzapytaniusub
. - Ponumeruj wiersze za pomocą innego elementu
row_number()
wywołanie, tym razem podzielone przezgrp
.
Jedno podzapytanie jest tutaj absolutnym minimum, ponieważ funkcji okna nie można zagnieżdżać.
Zauważ, że poszedłem z drugą wersją twoich sprzecznych danych przykładowych. Wynik jest taki, jak @mu sugerowane
w swoim komentarzu.
Również zakładając, że nie ma zduplikowanych dat. W tym przypadku musisz najpierw dokonać agregacji.