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;
Terwijl u spreekt van "rang" lijkt u het resultaat te willen hebben van de vensterfunctie row_number()
.
- Vorm groepen van opeenvolgende dagen (dezelfde datum in
grp
) in subquerysub
. - Nummer rijen met een andere
row_number()
oproep, deze keer gepartitioneerd doorgrp
.
Eén subquery is hier het absolute minimum, aangezien vensterfuncties niet genest kunnen worden.
Merk op dat ik ging met de tweede versie van uw tegenstrijdige voorbeeldgegevens. En het resultaat is zoals @mu suggereerde
in zijn commentaar.
Ook ervan uitgaande dat er geen dubbele datums zijn. In dit geval moet u eerst aggregeren.