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

已用窗口函数实现Average by ID,如何用Snowflake SQL每行展示Overall Average?

问题

我希望在每行中显示overall average数值,该值应为(300+150+100)/3(即各ID对应的Average by ID的平均值)。我已通过窗口函数AVG(Value) OVER (PARTITION BY ID)实现了Average by ID列,预期结果如下表所示,请问如何用Snowflake SQL最优实现该需求?

IDDescSUB_IDValueAverage by IDOverall Average
1ABC10300300183.33
1ABC20150300183.33
1ABC30450300183.33
2DEF10150150183.33
2DEF20150150183.33
3EFG30100100183.33
3EFG10180100183.33
3EFG2020100183.33
解决方案

直接使用嵌套窗口函数是Snowflake中最优的实现方式,无需额外子查询或CTE,仅需一次数据扫描即可完成计算:

SELECT 
    ID,
    "Desc",
    SUB_ID,
    Value,
    -- 计算每个ID的平均值(你已实现的逻辑)
    AVG(Value) OVER (PARTITION BY ID) AS "Average by ID",
    -- 基于ID级别的平均值,计算全局整体平均,每行重复显示
    ROUND(AVG(AVG(Value) OVER (PARTITION BY ID)) OVER (), 2) AS "Overall Average"
FROM your_table_name
ORDER BY ID, SUB_ID;

逻辑说明

  1. 内层窗口函数AVG(Value) OVER (PARTITION BY ID):按ID分组计算每个ID对应的平均值,即Average by ID列。
  2. 外层窗口函数AVG(...) OVER ():将所有ID的平均值作为数据集,计算它们的算术平均;OVER ()表示不分区、不排序,因此该值会在每一行重复显示。
  3. ROUND(..., 2)用于将结果保留两位小数,匹配预期输出格式,若不需要可以去掉。

内容的提问来源于stack exchange,提问作者StackFeel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:15:56