sql >> Database teknologi >  >> RDS >> PostgreSQL

på hinanden følgende dage i sql

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:

  1. Den vælger dagens rekord fra attendance bord. Hvis dagens rekord ikke er tilgængelig, vælger den gårsdagens rekord
  2. 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



  1. 5 tricks til at sikre SQL Server Peak Performance

  2. 'Forbinde' en rails-app til en allerede eksisterende MySQL DB?

  3. SQL-kommando mellem to datotider for bordreservation

  4. MySQL Vælg flere værdier