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

Presto使用sum over partition by窗口函数计算周期消费报错如何解决

Presto多周期预算累计消费查询解决方案

问题原因

原SQL存在3处错误:

  • 语法错误:CASE判断分支存在拼写错误,when as spend_over_period = 'one_time'属于非法语法
  • 冗余GROUP BY:SQL中使用窗口函数而非普通聚合函数,窗口函数会逐行返回计算结果,无需添加GROUP BY分组,多余的分组规则会触发非聚合字段的校验报错
  • 窗口函数逻辑缺失:未在SUM()窗口函数中添加ORDER BY子句,会返回分区内所有消费的总求和,无法得到按日期滚动的累计结果

正确SQL

select 
    s.day, 
    s.client_id, 
    b.budget_id, 
    b.budget_period, 
    b.budget_amount,
    s.spend,
    case 
        when b.budget_period = 'daily' then s.spend
        when b.budget_period = 'monthly' then sum(s.spend) over (partition by b.budget_id, date_trunc('month', date(s.day)) order by s.day)
        when b.budget_period = 'one_time' then sum(s.spend) over (partition by b.budget_id order by s.day)
    end as spend_over_period
from spend_table as s
join budget_table as b
    on s.day = b.day
    and s.client_id = b.client_id 
order by s.client_id, s.day

逻辑说明

  • 按budget_id+月份分区计算月度预算的累计消费,保证不同月份的同预算ID数据不会被错误合并计算
  • 窗口函数增加order by s.day规则,实现按日期从小到大的滚动累计求和,和期望输出的累计逻辑一致
  • 去掉冗余的GROUP BY子句,避免非聚合字段的校验错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:12:02