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 :
- 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 - 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