sql >> Databasteknik >  >> RDS >> PostgreSQL

på varandra följande dagar i sql

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:

  1. Den väljer dagens rekord från attendance tabell. Om dagens post inte är tillgänglig väljer den gårdagens post
  2. 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



  1. Det går inte att släppa en roll som är beviljad för att ansluta databas

  2. SQL Server Plans:skillnad mellan Index Scan / Index Seek

  3. Postgresql Skapa unikt index

  4. Jag behöver ändra datumformatet med php