Ето моето решение на този проблем с помощта на 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;
Проверете кода на SQL Fiddle
Ето как работи заявката:
- Избира днешния запис от
attendance
маса. Ако днешният запис не е наличен, тогава се избира вчерашният запис - След това продължава да добавя рекурсивно запис ден преди най-малката дата
Ако искате да изберете най-новия последователен диапазон от дати, независимо кога е било последното присъствие на потребителя (днес, вчера или преди x дни), тогава частта за инициализация на CTE трябва да бъде заменена с фрагмента по-долу:
SELECT MAX(attendanceDate) FROM attendance
[EDIT]Ето заявка в SQL Fiddle, която разрешава вашия въпрос №1:SQL Fiddle