PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

aufeinanderfolgende Tage in sql

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:

  1. Es wählt den heutigen Rekord aus attendance aus Tisch. Wenn der heutige Datensatz nicht verfügbar ist, wird der gestrige Datensatz ausgewählt
  2. 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