如何实现满足特定逻辑的SQL计算列Col3?求解决方案
实现依赖前一行计算结果的Col3计算列
数据集
| Record_Number | Col1 | Col2 | Col3 (预期结果) |
|---|---|---|---|
| 1 | 123 | 1 | 123 |
| 2 | 456 | 1 | 456 |
| 3 | 789 | 2 | 456 |
| 4 | 147 | 2 | 456 |
| 5 | 258 | 3 | 258 |
| 6 | 852 | 4 | 258 |
| 7 | 963 | 2 | 258 |
| 8 | 213 | 1 | 213 |
需求
创建计算列Col3,逻辑如下:
- 当
Col2等于1或3时,返回当前行的Col1 - 否则返回上一行的Col3计算结果
原方法的问题
你尝试的LAG()函数无法实现这个逻辑,因为窗口函数是基于整个数据集的原始列计算的,无法引用当前查询中正在生成的Col3列——LAG(Col3)访问的是还未计算完成的列值,自然得不到正确结果。
正确实现:递归CTE
递归CTE可以逐行处理数据,继承上一行的计算结果,完美适配这种依赖前一行的逻辑:
WITH RecursiveCTE AS ( -- 锚点成员:处理第一行,直接取Col1作为Col3 SELECT Record_Number, Col1, Col2, CAST(Col1 AS INT) AS Col3 FROM tbl1 WHERE Record_Number = 1 UNION ALL -- 递归成员:逐行处理后续数据,继承上一行的Col3值 SELECT t.Record_Number, t.Col1, t.Col2, CASE WHEN t.Col2 IN (1, 3) THEN t.Col1 ELSE r.Col3 END AS Col3 FROM tbl1 t JOIN RecursiveCTE r ON t.Record_Number = r.Record_Number + 1 ) SELECT * FROM RecursiveCTE ORDER BY Record_Number;
代码说明
- 锚点成员:定位到第一行数据,直接将
Col1赋值给Col3(符合第一行Col2=1的规则) - 递归成员:通过
Record_Number关联上一行的递归结果,判断当前行Col2是否满足条件:- 满足条件则取当前
Col1 - 不满足则用上一行的
Col3值
- 满足条件则取当前
- 最后查询递归CTE的结果,按
Record_Number排序即可得到预期的Col3列
内容的提问来源于stack exchange,提问作者mlo356
相关产品推荐
相关产品推荐

