PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

giorni consecutivi in ​​sql

Ecco la mia soluzione a questo problema utilizzando 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;

Controlla il codice in SQL Fiddle

Ecco come funziona la query:

  1. Seleziona il record di oggi da attendance tavolo. Se il record di oggi non è disponibile, seleziona il record di ieri
  2. Continua quindi ad aggiungere record ricorsivamente un giorno prima della data minima

Se desideri selezionare l'ultimo intervallo di date consecutivo indipendentemente da quando è stata l'ultima presenza dell'utente (oggi, ieri o x giorni prima), la parte di inizializzazione di CTE deve essere sostituita dallo snippet seguente:

SELECT MAX(attendanceDate) FROM attendance

[EDIT]Ecco una query su SQL Fiddle che risolve la tua domanda n. 1:SQL Fiddle