Redshift中如何用SQL实现行与前一行的差值计算?
Redshift月度数值差值计算实现
要实现当月数值与上月数值的差值计算,Redshift可以通过**窗口函数LAG()**轻松完成,核心逻辑是获取上月的数值并与当前月做减法。
假设表结构
假设你的数据存储在表monthly_data中,包含两个字段:
month_name:月份名称(如'一月'、'二月')value:对应月份的数值
解决方案SQL
SELECT month_name, CASE WHEN LAG(value) OVER (ORDER BY month_num) IS NULL THEN value ELSE value - LAG(value) OVER (ORDER BY month_num) END AS value_diff FROM ( SELECT month_name, value, -- 给中文月份分配排序序号,确保顺序正确 CASE month_name WHEN '一月' THEN 1 WHEN '二月' THEN 2 WHEN '三月' THEN 3 WHEN '四月' THEN 4 WHEN '五月' THEN 5 WHEN '六月' THEN 6 -- 可根据实际需求扩展更多月份 END AS month_num FROM monthly_data ) t ORDER BY month_num;
逻辑说明
- 内层子查询通过
CASE给每个中文月份分配数字序号month_num,避免字符串排序导致的月份顺序错乱,保证窗口函数的排序逻辑正确。 - 外层查询使用
LAG(value) OVER (ORDER BY month_num)获取当前行的上一行(上月)的value值。 - 通过
CASE判断处理边界情况:如果是第一行(一月,无上月数据),直接返回原数值;其余月份用当前数值减去上月数值得到差值。
执行结果
运行上述SQL后,将得到你期望的结果:
| month_name | value_diff |
|---|---|
| 一月 | 1000 |
| 二月 | 500 |
| 三月 | -300 |
| 四月 | 1300 |
| 五月 | -1500 |
| 六月 | 4000 |
内容的提问来源于stack exchange,提问作者José Erildo
相关产品推荐
相关产品推荐

