Hier is mijn oplossing voor dit probleem met behulp van 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;
Controleer de code op SQL Fiddle
Hier is hoe de query werkt:
- Het selecteert het record van vandaag uit
attendance
tafel. Als het record van vandaag niet beschikbaar is, wordt het record van gisteren geselecteerd - Het blijft dan een dag voor de minste datum recursief een record toevoegen
Als u de laatste opeenvolgende periode wilt selecteren, ongeacht wanneer de laatste aanwezigheid van de gebruiker was (vandaag, gisteren of x dagen ervoor), dan moet het initialisatiegedeelte van CTE worden vervangen door onderstaand fragment:
SELECT MAX(attendanceDate) FROM attendance
[EDIT]Hier is een query op SQL Fiddle die uw vraag #1 oplost:SQL Fiddle