PostgreSQL: подсчет строк, в которых условие на дату начала и дату окончания вписывается в сгенерированный временной ряд - PullRequest
1 голос
/ 28 марта 2020

У меня есть данные, организованные так:

CREATE TABLE sandbox.tab_1 (id serial, started timestamp, ended timestamp);
INSERT INTO sandbox.tab_1 (id, started, ended) VALUES
    (1, '2020-01-03'::timestamp, NULL),
    (2, '2020-01-05'::timestamp, '2020-01-06'),
    (3, '2020-01-07'::timestamp,  NULL),
    (4, '2020-01-08'::timestamp,  NULL);

enter image description here

Мне нужно подсчитать количество строк, где started >= и ended <, чем сгенерированный временной ряд, который начинается с min(started) to max(started). Это дало бы мне на каждый день запас начальных и не законченных идентификаторов в данный момент времени. Результат будет примерно таким:

enter image description here

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Вы можете LEFT JOIN, чтобы таблица с сериями временных меток в начале была меньше или равна временной метке, а конец был больше, чем временная метка или был NULL. Затем GROUP BY отметки времени и возьмите count().

SELECT gs.ts,
       count(t1.started)
       FROM generate_series('2020-01-03'::timestamp, '2020-01-08'::timestamp, '1 day'::interval) gs (ts)
            LEFT JOIN tab_1 t1
                      ON t1.started <= gs.ts
                         AND (t1.ended IS NULL
                               OR t1.ended > gs.ts)
       GROUP BY gs.ts
       ORDER BY gs.ts;

db <> скрипка

0 голосов
/ 28 марта 2020

Вот один вариант с generate_series() и union all:

select ts, sum(sum(cnt)) over(order by ts) stock
from (
    select generate_series(min(started), max(started), interval '1' day) ts, 0 cnt from tab_1
    union all select started, 1 from tab_1
    union all select ended, -1 from tab_1 where ended is not null

) t
group by ts
order by ts

Демонстрация на DB Fiddlde :

ts                  | stock
:------------------ | ----:
2020-01-03 00:00:00 |     1
2020-01-04 00:00:00 |     1
2020-01-05 00:00:00 |     2
2020-01-06 00:00:00 |     1
2020-01-07 00:00:00 |     2
2020-01-08 00:00:00 |     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...