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

Подвижен брой редове в интервал от време

Звуци като приложение за прозоречни функции . Но, за съжаление, това не е така. Рамките на прозорците могат да се основават само на броя на редовете, а не на действителните стойности на колоните.

Проста заявка с LEFT JOIN може да свърши работата:

SELECT t0.order_id
     , count(t1.time_created) AS count_within_3_sec
FROM   tbl      t0
LEFT   JOIN tbl t1 ON t1.time_created BETWEEN t0.time_created - interval '3 sec'
                                          AND t0.time_created
GROUP  BY 1
ORDER  BY 1;

db<>fiddle тук

Не работи с time като във вашата минимална демонстрация, тъй като това не се увива. Предполагам, че е разумно да приемем timestamp или timestamptz .

Тъй като включвате всеки ред в преброяването, INNER JOIN също ще работи. (LEFT JOIN все още е по-надежден в лицето на възможни NULL стойности.)

Или използвайте LATERAL подзаявка и не е необходимо да обобщавате на външно ниво на заявка:

SELECT t0.order_id
     , t1.count_within_3_sec
FROM   tbl t0
LEFT   JOIN LATERAL (
   SELECT count(*) AS count_within_3_sec
   FROM   tbl t1
   WHERE  t1.time_created BETWEEN t0.time_created - interval '3 sec'
                              AND t0.time_created
   ) t1 ON true
ORDER  BY 1;

Свързани:

За големи маси и много редове във времевата рамка, процедурно решение, което минава през таблицата веднъж ще се представи по-добре. Като:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да направя по-малко от, по-голямо от в JSON полета на Postgres?

  2. Конкатениране на множество редове в масив с SQL на PostgreSQL

  3. postgres:получаване на изпълнима заявка от заявка с параметри

  4. Мога ли да създам избирателно резервно копие на база данни на Postgres само с определени таблици?

  5. Разделяне на дати въз основа на фискалната година