Zde je moje řešení tohoto problému 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;
Zkontrolujte kód na SQL Fiddle
Dotaz funguje následovně:
- Vybere dnešní záznam z
attendance
stůl. Pokud dnešní záznam není dostupný, vybere se včerejší záznam - Pak pokračuje v přidávání rekurzivních záznamů den před datem nejmenšího data
Pokud chcete vybrat poslední po sobě jdoucí časové období bez ohledu na to, kdy byla poslední návštěva uživatele (dnes, včera nebo x dní předtím), musí být inicializační část CTE nahrazena níže uvedeným úryvkem:
SELECT MAX(attendanceDate) FROM attendance
[EDIT]Zde je dotaz na SQL Fiddle, který řeší vaši otázku č. 1:SQL Fiddle