sql >> Base de Datos >  >> RDS >> PostgreSQL

dias consecutivos en sql

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:

  1. Selecciona el registro de hoy de attendance mesa. Si el registro de hoy no está disponible, selecciona el registro de ayer
  2. 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