我想计算 10 天的滚动总和。问题是时间不规律,例如有时我们在同一日期进行几次观察,然后中间缺少一些日期。
模拟数据如下:
订单_id | 订单完成时间 | 订单金额 | 客户 ID | 日期_差_10_天 | sum_10_days |
---|---|---|---|---|---|
ord_1 | 2024-05-01 | 1 | aad_1 | 2024-04-21 | 1 |
ord_2 | 2024-05-01 | 5 | aad_1 | 2024-04-21 | 6 |
ord_3 | 2024-05-05 | 10 | aad_1 | 2024-04-25 | 16 |
ord_4 | 2024-05-15 | 15 | aad_1 | 2024-05-05 | 25 |
我的想法是使用窗口函数,以及
sum(if(date_diff_10_days <= order_completed_at , order_amount,0 ))
select
* ,
sum(if(
date_diff_10_days <= order_completed_at
, order_amount, 0)) as sum_10_days
OVER (PARTITION BY customer_id order by order_completed_at asc
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
from mock_data
查询返回所有记录的累积和,而不仅仅是 10 天时间窗口内的记录。有人知道如何解决我的查询吗?
我创建了一个示例查询
order_id
、order_completed_at
、order_amount
并计算了过去 10 天的滚动总和。我没有 Big Query,因此无法测试。我以 postgres 为例。
我已经使用了额外的日期来测试小提琴中的场景,请告诉我
WITH rolling_sum AS (
SELECT
o1.order_id,
o1.order_completed_at,
o1.order_amount,
o1.customer_id,
SUM(o2.order_amount) AS sum_10_days
FROM orders o1
JOIN orders o2
ON o1.customer_id = o2.customer_id
AND o2.order_completed_at >= o1.order_completed_at - INTERVAL '10 days'
AND o2.order_completed_at <= o1.order_completed_at
GROUP BY
o1.order_id,
o1.order_completed_at,
o1.order_amount,
o1.customer_id
)
SELECT * FROM rolling_sum
ORDER BY order_id;
输出