You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:49:50