Как написать sql для создания совокупных ежемесячных продаж на одного клиента в Postgres - PullRequest
0 голосов
/ 23 мая 2018

Учитывая, что у меня есть таблица с именем orders

заказов

id
customer_id
created_at

Как мне написать запрос для получения ежемесячного суммарного количества заказов для каждогопокупатель?Я хочу включить пропущенные месяцы в серию за январь 2018 года по май 2018 года

данные

id   customer_id   created_at
1    200           01/20/2018
2    300           01/21/2018
3    200           01/22/2018
4    200           03/20/2018
5    300           03/20/2018
6    200           04/20/2018
7    200           04/20/2018

ожидаемый результат

customer_id   month       count
200           01/01/2018  2
200           02/01/2018  2
200           03/01/2018  3
200           04/01/2018  5
200           05/01/2018  5

300           01/01/2018  1
300           02/01/2018  1
300           03/01/2018  2
300           04/01/2018  2
300           05/01/2018  2

У меня есть запрос для расчета чистого совокупного количества в месяц.У меня не было большого успеха при преобразовании запроса в работу для кумулятивного подсчета на одного клиента.

WITH monthly_orders AS (
   SELECT date_trunc('month', orders.created_at) AS mon, 
          COUNT(orders.id) AS mon_count
   from   orders
   GROUP  BY 1
)
SELECT TO_CHAR(mon, 'YYYY-MM') AS mon_text,
       COALESCE(SUM(c.mon_count) OVER (ORDER BY c.mon), 0) AS running_count
FROM   generate_series('2018-01-01'::date, '2018-06-01'::date, interval '1 month') mon
LEFT JOIN monthly_orders c USING(mon)
ORDER  BY mon_text; 

1 Ответ

0 голосов
/ 23 мая 2018

Если я правильно понимаю, вы можете просто сделать:

select o.customer_id, date_trunc('month', o.created_at) AS mon, 
       count(*) AS mon_count,
       sum(count(*)) over (partition by o.customer_id
                           order by date_trunc('month', o.created_at) 
                          ) as running_count
from  orders o
group by o.customer_id, mon
order by o.customer_id, mon;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...