PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

последователни дни в sql

Ето моето решение на този проблем с помощта на 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;

Проверете кода на SQL Fiddle

Ето как работи заявката:

  1. Избира днешния запис от attendance маса. Ако днешният запис не е наличен, тогава се избира вчерашният запис
  2. След това продължава да добавя рекурсивно запис ден преди най-малката дата

Ако искате да изберете най-новия последователен диапазон от дати, независимо кога е било последното присъствие на потребителя (днес, вчера или преди x дни), тогава частта за инициализация на CTE трябва да бъде заменена с фрагмента по-долу:

SELECT MAX(attendanceDate) FROM attendance

[EDIT]Ето заявка в SQL Fiddle, която разрешава вашия въпрос №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. Postgres UPSERT използва повторно стойности на колони от INSERT на UPDATE

  2. Cascade persist създава дублиращи се редове?

  3. Обединете редове postgres и заменете стойностите с най-новите, когато не са null

  4. Изтриванията на PostgresSql 9.6 изведнъж станаха бавни

  5. Има ли някакъв начин да използвате OrmLite с Postgres hstores?