Как получить все дни из диапазона дат и группы по этим дням? - PullRequest
0 голосов
/ 16 июня 2020

Итак, у меня есть такая таблица.

user_id      start_date      end_date
1            2020-06-14      2020-06-16
2            2020-06-15      2020-06-17
....

Я хочу получить что-то вроде этого

date           user_ids
2020-06-14     1
2020-06-15     1,2
2020-06-16     1,2
2020-06-17     2

1 Ответ

2 голосов
/ 16 июня 2020

Вы можете попробовать присоединить календарную таблицу к текущей таблице, а затем агрегировать по дням:

WITH dates AS (
    SELECT date_trunc('day', dd)::date AS date
    FROM generate_series
    ( '2020-06-14'::timestamp 
    , '2020-06-17'::timestamp
    , '1 day'::interval) dd
)

SELECT
    d.date,
    STRING_AGG(t.user_id::text, ',' ORDER BY t.user_id) AS user_ids
FROM dates d
LEFT JOIN yourTable t
    ON d.date BETWEEN t.start_date AND t.end_date
GROUP BY
    d.date
ORDER BY
    d.date;

screen capture from demo link below

Демо

Если вам нужно расширить диапазон календарной таблицы, чтобы охватить больше актуальных данных, просто отредактируйте CTE и измените даты начала и окончания.

...