能但CASE必须嵌套在SUM()内ROWS比RANGE更可控ORDER BY需唯一或加辅助列NULL需显式处理为0索引和窗口范围影响性能。用 SUM() 窗口函数 CASE 实现条件移动求和直接说结论能但必须把 CASE 写在 SUM() 里面不能反过来。窗口函数作用于聚合结果不是先过滤再开窗。常见错误是写成 SUM(CASE WHEN ... THEN value END) OVER (ORDER BY t ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) —— 这其实是对的错的是写成 CASE WHEN ... THEN SUM(value) OVER (...) END后者会丢失窗口上下文变成全表或分组级求和。CASE 必须嵌套在聚合函数内否则无法按行条件参与累计移动范围ROWS BETWEEN ...决定“往前看几行”不写默认是 UNBOUNDED PRECEDING容易误算成从头累加排序字段ORDER BY必须唯一或带足够区分度否则同序多行的累计顺序不确定ROWS BETWEEN 和 RANGE BETWEEN 的实际差异绝大多数场景该用 ROWS而不是 RANGE。前者按物理行数滑动后者按排序值“区间”滑动——遇到重复排序值时RANGE 会把所有同值行全包进来导致窗口大小失控。比如按日期排序某天有 5 条记录RANGE BETWEEN 1 PRECEDING AND CURRENT ROW 可能拉进来当天全部 5 行 前一天所有行而你本意只是要最近 2 天的行。时间类序列优先用 ROWS配合 ORDER BY ts ts 字段去重或加唯一辅助列RANGE 适合数值型连续指标如分数、温度且确认无大量重复值MySQL 8.0、PostgreSQL、SQL Server 都支持 ROWS但旧版 MySQL 不支持窗口函数别踩坑NULL 值怎么处理SUM() 默认跳过但逻辑可能被绕过SUM() 确实自动忽略 NULL但如果你在 CASE 里没写 ELSE那不满足条件的行就返回 NULL等价于不参与求和——这通常是想要的。但要注意如果想让不满足条件的行贡献 0必须显式写 ELSE 0。 Trenz AI驱动的社交电商营销平台专为TikTok Shop设计