PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

kolejne dni w sql

Oto moje rozwiązanie tego problemu za pomocą 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;

Sprawdź kod na SQL Fiddle

Oto jak działa zapytanie:

  1. Wybiera dzisiejszy rekord z attendance stół. Jeśli dzisiejszy rekord nie jest dostępny, wybiera wczorajszy rekord
  2. Następnie dodaje rekursywnie rekord na dzień przed najmniejszą datą

Jeśli chcesz wybrać ostatni kolejny zakres dat niezależnie od tego, kiedy była ostatnia obecność użytkownika (dzisiaj, wczoraj lub x dni wcześniej), to część inicjującą CTE należy zastąpić poniższym fragmentem:

SELECT MAX(attendanceDate) FROM attendance

[EDIT]Oto zapytanie w SQL Fiddle, które rozwiązuje Twoje pytanie nr 1:SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy możesz utworzyć indeks w definicji CREATE TABLE?

  2. Plik ~/.psqlrc dla DBA

  3. W migracji Rails, jak ustawić domyślną wartość kolumny na NOW() zamiast czasu uruchomienia migracji?

  4. Postgres JSONb do XML z tag_name i tag_value

  5. Aktualizacja Postgres z lewego przyłączenia