p累计增长值等于当前行值减去组内首行值后的差值再累计求和正确写法是SUM(value - FIRST_VALUE(value) OVER(PARTITION BY group_col ORDER BY time_col)) OVER(PARTITION BY group_col ORDER BY time_col)。/p怎么用 ROW_NUMBER() 和 SUM() OVER() 算分组内累计增长直接说结论累计增长值 ≠ 累计求和它得是「当前行值减去组内首行值」再叠加成累计。很多人一上来就写 SUM(value) OVER(PARTITION BY group_col ORDER BY time_col)结果算出来是累计和不是累计增长。正确做法是先用 FIRST_VALUE() 拿到每组第一行的基准值再用当前行值减它最后套一层 SUM() OVER() 累加差值SELECT group_col, time_col, value, SUM(value - FIRST_VALUE(value) OVER(PARTITION BY group_col ORDER BY time_col)) OVER(PARTITION BY group_col ORDER BY time_col) AS cum_growthFROM t;FIRST_VALUE(value) OVER(...) 必须带 ORDER BY否则窗口默认是 UNBOUNDED PRECEDING TO UNBOUNDED FOLLOWING取不到“首行”两层 OVER 嵌套没问题但外层必须和内层 PARTITION BY 一致否则基准值会错乱如果时间字段有重复ORDER BY time_col 可能导致 FIRST_VALUE() 结果不稳定建议加个唯一排序键比如 id防歧义为什么不能用 LAG() 逐行相减再累加有人想先算每行相比上一行的增长value - LAG(value)再对这个差值做累计和。逻辑看似通但实际漏掉了起点偏移——累计增长是从组内第一行开始算“涨了多少”不是“每步涨多少的累加”。比如组内值是 [100, 120, 110, 130]逐行差值是 [NULL, 20, -10, 20]累计差值变成 [NULL, 20, 10, 30]而真正的累计增长应是 [0, 20, 10, 30] —— 第一行必须为 0。 Ideogram Ideogram是一个全新的文本转图像AI绘画生成平台擅长于生成带有文本的图像如LOGO上的字母、数字等。