Как суммировать информацию за период c в sql? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть таблица с заказами и следующие поля:

create table orders2 (
  orderID int,
  customerID int,
  date DateTime,
  amount int) 
engine=Memory;

Каждый клиент может сделать 0 или много заказов каждый день. Мне нужно создать запрос SQL, который будет показывать для каждого клиента, сколько заказов он / она сделал в течение 3 дней, начиная со дня, когда клиент сделал свой первый заказ.

Итак для каждого клиента запрос должен определить дату первого заказа, затем вычислить дату, которая будет через 3 дня после первой даты, затем отфильтровать строки, чтобы принимать только заказы с датами в данном диапазоне, и затем выполнить подсчет заказов (orderID) в этот период времени. На данный момент мне удалось просто определить дату первого заказа для каждого клиента.

 SELECT 
    O.customerID, 
    O.date AS first_day, 
    COUNT(O.orderID) AS first_day_orders_num, 
    SUM(O.amount) AS first_day_amount
 FROM orders2 AS O
 INNER JOIN 
(
    SELECT 
        customerID, 
        MIN(date) AS first_date
    FROM orders2
    GROUP BY customerID
) AS I ON (O.customerID = I.customerID) AND (O.date = I.first_date)
GROUP BY 
    O.customerID, 
    O.date

Ответы [ 3 ]

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

Я не очень понимаю, какой результат вам нужен. Вероятно, это можно решить с помощью массивов.

Вот решение с использованием ванили sql

select customerID, min(first_date), sum(num_orders_per_day)
from ( 
   select customerID, date, min(date) first_date, count() num_orders_per_day
   from orders2
   group by customerID, date
   having date <= first_date + interval 3 days
   )
group by customerID   
0 голосов
/ 26 марта 2020

Попробуйте этот запрос:

SELECT customerID, orders_count
FROM  (
  SELECT customerID, 
    arraySort(x -> x.1, groupArray((date, orderID))) sorted_date_per_order_pairs,
    sorted_date_per_order_pairs[1].1 + INTERVAL 3 day AS end_date,
    arrayFilter(x -> x.1 < end_date, sorted_date_per_order_pairs) orders_in_period,
    length(orders_in_period) orders_count
  FROM orders2
  GROUP BY customerID);
0 голосов
/ 26 марта 2020

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

select o.CustomerID, count(*) as num_orders_3_days
from (select o.*, min(date) over (partition by CustomerID) as min_date
      from orders o
     ) o
where date < min_date + interval '3 day'
group by CustomerID;
...