如何在BigQuery中用窗口函数计算指定日期范围的求和及DOS列?
解决方案
场景1:仅需每个Item的聚合结果(无原明细行)
直接用GROUP BY按item分组计算即可,无需窗口函数,这是最直接的实现方式:
SELECT item, SUM(qty) AS total_qty, SUM(fcst) AS total_fcst, coverage_days, -- 假设每个item的coverage_days为固定值,若存在多值需先聚合(如取MAX/AVG) (SUM(qty) / NULLIF(SUM(fcst), 0)) * coverage_days AS DOS FROM your_table GROUP BY item, coverage_days;
注意:用NULLIF(SUM(fcst), 0)避免除数为0的报错,若fcst总和为0,DOS会返回NULL,可根据业务需求替换为0或其他默认值。
场景2:保留原明细行,同时展示聚合值和DOS
这种场景才需要窗口函数,通过PARTITION BY item限定每个item的聚合范围:
SELECT *, SUM(qty) OVER (PARTITION BY item) AS total_qty, SUM(fcst) OVER (PARTITION BY item) AS total_fcst, (SUM(qty) OVER (PARTITION BY item) / NULLIF(SUM(fcst) OVER (PARTITION BY item), 0)) * coverage_days AS DOS FROM your_table;
说明:如果同一个item对应多个不同的coverage_days值,需先确定统一取值规则,比如用MAX(coverage_days) OVER (PARTITION BY item)替换原coverage_days字段。
窗口函数使用失败的常见原因
- 未正确指定
PARTITION BY item,导致聚合范围覆盖了所有数据而非单个item - 同一item的coverage_days存在多值,计算DOS时出现逻辑冲突
- 未处理除数为0的情况,引发SQL执行报错
内容的提问来源于stack exchange,提问作者radhika sharma
相关产品推荐
相关产品推荐

