PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

dias consecutivos em sql


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:
  1. Seleciona o registro de hoje de attendance tabela. Se o registro de hoje não estiver disponível, ele seleciona o registro de ontem
  2. 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