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:
- Seleziona il record di oggi da
attendance
tavolo. Se il record di oggi non è disponibile, seleziona il record di ieri - 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