Oto moje rozwiązanie tego problemu za pomocą 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;
Sprawdź kod na SQL Fiddle
Oto jak działa zapytanie:
- Wybiera dzisiejszy rekord z
attendance
stół. Jeśli dzisiejszy rekord nie jest dostępny, wybiera wczorajszy rekord - Następnie dodaje rekursywnie rekord na dzień przed najmniejszą datą
Jeśli chcesz wybrać ostatni kolejny zakres dat niezależnie od tego, kiedy była ostatnia obecność użytkownika (dzisiaj, wczoraj lub x dni wcześniej), to część inicjującą CTE należy zastąpić poniższym fragmentem:
SELECT MAX(attendanceDate) FROM attendance
[EDIT]Oto zapytanie w SQL Fiddle, które rozwiązuje Twoje pytanie nr 1:SQL Fiddle