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

jours consécutifs en sql

Voici ma solution à ce problème en utilisant CTE

WITH RECURSIVE CTE(attendanceDate)
AS
(
   SELECT * FROM 
   (
      SELECT attendanceDate FROM attendance WHERE attendanceDate = current_date 
      OR attendanceDate = current_date - INTERVAL '1 day' 
      ORDER BY attendanceDate DESC
      LIMIT 1
   ) tab
   UNION ALL

   SELECT a.attendanceDate  FROM attendance a
   INNER JOIN CTE c
   ON a.attendanceDate = c.attendanceDate - INTERVAL '1 day'
) 
SELECT COUNT(*) FROM CTE;

Vérifiez le code sur SQL Fiddle

Voici comment fonctionne la requête :

  1. Il sélectionne l'enregistrement d'aujourd'hui à partir de attendance table. Si l'enregistrement d'aujourd'hui n'est pas disponible, il sélectionne l'enregistrement d'hier
  2. Il continue ensuite d'ajouter de manière récursive un enregistrement un jour avant la plus petite date

Si vous souhaitez sélectionner la dernière plage de dates consécutives, quelle que soit la date de la dernière participation de l'utilisateur (aujourd'hui, hier ou x jours avant), la partie d'initialisation de CTE doit être remplacée par l'extrait ci-dessous :

SELECT MAX(attendanceDate) FROM attendance

[EDIT]Voici une requête sur SQL Fiddle qui résout votre question n° 1 :SQL Fiddle