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

如何用SQL窗口函数计算客户的3个月滚动邮件发送量总和?

计算客户3个月滚动邮件发送量总和

我有一张结构如下的表,需要计算每个客户的3个月滚动邮件发送量总和,比如客户1在2023-06-30的3个月滚动总和为5(2+null+3)。我尝试用带分区和范围的SQL查询,但对窗口函数理解不到位,附上我的尝试代码:

SELECT cust_id,
  eom_date, 
  SUM(email_sent),
  SUM(email_sent) OVER (cust_id ORDER BY time_eom_date RANGE BETWEEN 3 PRECEDING AND CURRENT ROW) total_email_3month
FROM my_table
GROUP BY 1, 2

原始表结构

cust_ideom_dateemail_sent
12023-06-302
12023-05-31null
12023-04-303
12023-03-312
12023-02-28null
12023-01-31null
22023-06-301
22023-05-311
22023-04-304
22023-03-31null
22023-02-282
22023-01-313
22022-12-311

预期输出结果

cust_ideom_dateemail_senttotal_email_3month
12023-06-3025
12023-05-31null5
12023-04-3035
12023-03-3122
12023-02-28null0
12023-01-31null0
22023-06-3016
22023-05-3115
22023-04-3046
22023-03-31null5
22023-02-2826
22023-01-3134
22022-12-3111

问题分析与修正

你的尝试代码存在几个关键问题:

  1. 窗口函数缺少PARTITION BY关键字,正确的分区语法应为PARTITION BY cust_id,而非直接写cust_id。
  2. 排序字段写错,应该是eom_date而非time_eom_date。
  3. RANGE BETWEEN 3 PRECEDING是数值范围偏移,不适用于日期类型,需用时间区间定义窗口。
  4. 原始表已按客户+月份存储单条记录,无需额外分组求和。

正确SQL查询

SELECT 
    cust_id,
    eom_date,
    email_sent,
    COALESCE(SUM(COALESCE(email_sent, 0)) OVER (
        PARTITION BY cust_id 
        ORDER BY eom_date 
        RANGE BETWEEN INTERVAL '2 months' PRECEDING AND CURRENT ROW
    ), 0) AS total_email_3month
FROM my_table
ORDER BY cust_id, eom_date DESC;

代码说明

  • PARTITION BY cust_id:按客户分组,保证每个客户的滚动计算独立进行。
  • ORDER BY eom_date:按日期排序,确定窗口的时间顺序。
  • RANGE BETWEEN INTERVAL '2 months' PRECEDING AND CURRENT ROW:定义窗口为当前日期及往前推2个月的区间,刚好覆盖3个连续月份(当前月+前两个月)。
  • COALESCE(email_sent, 0):将null转为0,避免求和时忽略空值导致结果偏差。
  • 外层COALESCE(..., 0):确保窗口内全为空值时,结果显示0而非null,匹配预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:10:54