Условное суммирование в SQL - PullRequest
0 голосов
/ 26 октября 2019

У меня есть таблица с order_id, user_id, timestamp, dollar_spent. Отметка времени - когда происходит заказ. У меня также есть другая таблица с promo_id, user_id, promo_rate, start_ts, end_ts. Начало и конец - это когда акция действительна для этого пользователя. Когда пользователь размещает заказ при активной для него акции, он получает скидку со скоростью продвижения. Могут быть заказы, в которых нет активного продвижения или может быть активное продвижение, но нет заказов.

Вопросы: в одной выходной таблице нам нужно следующее: - Для каждой ставки продвижения общая сумма заказов в долларах, полученных, когда они активны. - Одна строка для каждой ставки продвижения (даже если заказов не было) -Один ряд без всякого продвижения

order_id user_id    ts  dollar_amount
1           1   2019-01-06  23
2           1   2019-01-19  18
2           2   2019-01-09  12

promotion_id user_id    promotion_rate     start_ts end_ts
1               1             0.1        2019-01-03 2019-01-08
2               1             0.15       2019-01-28 2019-02-05
3               1             0.05       2019-09-02 2019-09-10
4               2             0.1        2019-01-03 2019-01-08

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Я думаю, что вам нужен полный внешний вид, поскольку вы указали:

вам нужна одна строка для всех долларов продаж, когда не было продвижение по службе Одна строка для каждой ставки, когда продвижение было активным и total_dollars

Пример

with orders (order_id, user_id,    ts,  dollar_amount) as (
SELECT 1,           1,   '2019-01-06',  23 UNION ALL
SELECT 2,           1,   '2019-01-19',  18 UNION ALL
SELECT 2,           2,   '2019-01-09',  12),
Promotions (Promotion_ID, user_ID, Promotion_rate, start_Ts, End_TS) as (
SELECT 1,               1,             0.1,        '2019-01-03', '2019-01-08' UNION ALL
SELECT 2,               1,             0.15,       '2019-01-28', '2019-02-05' UNION ALL
SELECT 3,               1,             0.05,       '2019-09-02', '2019-09-10' UNION ALL
SELECT 4,               2,             0.1,        '2019-01-03', '2019-01-08')

SELECT P.promotion_rate
     , sum(O.Dollar_Amount) as Total_Dollars
FROM Promotions P
FULL OUTER JOIN Orders O
 on O.TS between P.Start_TS and P.End_TS
GROUP BY P.promotion_rate

Результаты:

+----+----------------+---------------+
|    | promotion_rate | Total_Dollars |
+----+----------------+---------------+
|  1 | NULL           | 30            |
|  2 | 0,05           | NULL          |
|  3 | 0,10           | 46            |
|  4 | 0,15           | NULL          |
+----+----------------+---------------+

Изначально я включил промо-код;но я считаю, что вы хотите, чтобы идентификаторы 1,4 были объединены в 1 строку.

Поскольку некоторые записи могут быть не связаны с рекламой, скорость будет нулевой, и в таких ситуациях все записи будут объединены.

0 голосов
/ 26 октября 2019

Вы, кажется, хотите left join и group by:

select p.promotion_rate, count(o.user_id) as num_orders
from promotions p left join
     orders o
     on o.user_id = p.user_id and
        o.ts between p.start_ts and p.end_ts
group by p.promotion_rate;
...