Her er min løsning på dette problem ved hjælp af 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;
Tjek koden på SQL Fiddle
Sådan fungerer forespørgslen:
- Den vælger dagens rekord fra
attendance
bord. Hvis dagens rekord ikke er tilgængelig, vælger den gårsdagens rekord - Den bliver derefter ved med at tilføje rekursiv registrering en dag før den mindste dato
Hvis du vil vælge det seneste fortløbende datointerval, uanset hvornår brugerens seneste deltagelse var (i dag, i går eller x dage før), skal initialiseringsdelen af CTE erstattes af nedenstående uddrag:
SELECT MAX(attendanceDate) FROM attendance
[EDIT]Her er en forespørgsel hos SQL Fiddle, som løser dit spørgsmål #1:SQL Fiddle