Я хочу иметь возможность генерировать группы строк по дням, неделям, месяцам или в зависимости от установленного интервала
После этого решение он работает, когда детализация по месяцам. Но пробуя интервал в 1 неделю, никакие записи не возвращаются.
Это строки на моем столе
Это текущий запрос, который у меня есть для месячного интервала, который отлично работает.
SELECT *
FROM (
SELECT day::date
FROM generate_series(timestamp '2018-09-01'
, timestamp '2018-12-01'
, interval '1 month') day
) d
LEFT JOIN (
SELECT date_trunc('month', created_date)::date AS day
, SUM(escrow_amount) AS profit, sum(total_amount) as revenue
FROM (
select distinct on (order_id) order_id, escrow_amount, total_amount, create_time from order_item
WHERE created_date >= date '2018-09-01'
AND created_date <= date '2018-12-01'
-- AND ... more conditions
) t2 GROUP BY 1
) t USING (day)
ORDER BY day;
Результат этого запроса
И это запрос интервала в неделю. Для краткости я уменьшу диапазон до двух месяцев.
SELECT *
FROM (
SELECT day::date
FROM generate_series(timestamp '2018-09-01'
, timestamp '2018-11-01'
, interval '1 week') day
) d
LEFT JOIN (
SELECT date_trunc('week', created_date)::date AS day
, SUM(escrow_amount) AS profit, sum(total_amount) as revenue
FROM (
select distinct on (order_id) order_id, escrow_amount, total_amount, create_time from order_item
WHERE created_date >= date '2018-09-01'
AND created_date <= date '2018-11-01'
-- AND ... more conditions
) t2 GROUP BY 1
) t USING (day)
ORDER BY day;
Обратите внимание, что у меня есть записи за октябрь, но результат здесь ничего не показывает для октябрьских дат.
Есть идеи, что мне здесь не хватает?





Результаты вашего первого запроса не усекаются до начала недели.
date_trunc('2018-09-01'::date, 'week')::date
равно
'2018-08-27'::date
поэтому ваше присоединение с использованием дня не работает
'2018-09-01'::date <> '2018-08-27'::date
Ваш запрос должен выглядеть примерно так:
SELECT *
FROM (
SELECT day::date
FROM generate_series(date_trunc('week',timestamp '2018-09-01') --series begin trunc
, timestamp '2018-11-01'
, interval '1 week') day
) d
LEFT JOIN (
SELECT date_trunc('week', created_date::date)::date AS day
, SUM(escrow_amount) AS profit, sum(total_amount) as revenue
FROM (
select distinct on (order_id) order_id, escrow_amount, total_amount, create_time from order_item
WHERE created_date::date >= date '2018-09-01'
AND created_date::date <= date '2018-11-01'
-- AND ... more conditions
) t2 GROUP BY 1
) t USING (day)
WHERE day >= '2018-09-01' --to skip days from begining of the week to the begining of the series before trunc
ORDER BY day;
я прикрепил пример кода. Вы должны указать даты в своей серии, чтобы они совпадали с началом недели. 01.09.2018 — это не начало недели, поэтому ваш ряд не соответствует датам из агрегированных сумм.
Я понимаю! Позвольте мне попробовать это!
хуху ты спас меня день! Оно работает! @Гржегож Санцевич
извините, изменил код. это должно быть просто created_date без ::date