PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Classement basé sur la séquence de dates

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() .

  1. Former des groupes de jours consécutifs (même date en grp ) dans la sous-requête sub .
  2. Numéroter les lignes avec un autre row_number() appel, cette fois partitionné par grp .

Une sous-requête est le strict minimum ici, car les fonctions de fenêtre ne peuvent pas être imbriquées.

SQL Fiddle.

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.