Här är min lösning på det här problemet med 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;
Kontrollera koden på SQL Fiddle
Så här fungerar frågan:
- Den väljer dagens rekord från
attendance
tabell. Om dagens post inte är tillgänglig väljer den gårdagens post - Den fortsätter sedan att lägga till rekursivt register en dag före det minsta datumet
Om du vill välja det senaste på varandra följande datumintervallet oavsett när användarens senaste närvaro var (idag, igår eller x dagar innan), måste initialiseringsdelen av CTE ersättas med nedanstående kodavsnitt:
SELECT MAX(attendanceDate) FROM attendance
[EDIT]Här är frågan på SQL Fiddle som löser din fråga #1:SQL Fiddle