Hier ist meine Lösung für dieses Problem mit 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;
Überprüfen Sie den Code unter SQL Fiddle
So funktioniert die Abfrage:
- Es wählt den heutigen Rekord aus
attendance
aus Tisch. Wenn der heutige Datensatz nicht verfügbar ist, wird der gestrige Datensatz ausgewählt - Es fügt dann rekursiv einen Tag vor dem kleinsten Datum hinzu
Wenn Sie den letzten aufeinanderfolgenden Datumsbereich unabhängig davon auswählen möchten, wann der Benutzer zuletzt anwesend war (heute, gestern oder vor x Tagen), muss der Initialisierungsteil von CTE durch das folgende Snippet ersetzt werden:
SELECT MAX(attendanceDate) FROM attendance
[BEARBEITEN] Hier ist eine Abfrage bei SQL Fiddle, die Ihre Frage Nr. 1 löst:SQL Fiddle