BigQuery 窗口函数

问题描述 投票:0回答:1

我想计算 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 天时间窗口内的记录。有人知道如何解决我的查询吗?

sql google-bigquery window-functions
1个回答
0
投票

我创建了一个示例查询

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;

输出

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.