Aquí está mi solución a este problema usando 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;
Compruebe el código en SQL Fiddle
Así es como funciona la consulta:
- Selecciona el registro de hoy de
attendance
mesa. Si el registro de hoy no está disponible, selecciona el registro de ayer - Luego sigue agregando registros recursivamente un día antes de la fecha mínima
Si desea seleccionar el último rango de fechas consecutivas independientemente de cuándo fue la última asistencia del usuario (hoy, ayer o x días antes), entonces la parte de inicialización de CTE debe reemplazarse por el siguiente fragmento:
SELECT MAX(attendanceDate) FROM attendance
[EDITAR] Aquí hay una consulta en SQL Fiddle que resuelve su pregunta n. ° 1:SQL Fiddle