Aqui está minha solução para 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;
Verifique o código em SQL Fiddle
Veja como a consulta está funcionando:
- Seleciona o registro de hoje de
attendance
tabela. Se o registro de hoje não estiver disponível, ele seleciona o registro de ontem - Ele continua adicionando recursivamente registro um dia antes da data mínima
Se você deseja selecionar o intervalo de datas consecutivo mais recente, independentemente de quando foi a última participação do usuário (hoje, ontem ou x dias antes), a parte de inicialização do CTE deve ser substituída pelo snippet abaixo:
SELECT MAX(attendanceDate) FROM attendance
[EDIT]Aqui está a consulta no SQL Fiddle que resolve sua pergunta nº 1:SQL Fiddle