我有下面的数据集
记录_编号 | 第 1 栏 | 第 2 栏 | 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 |
我无法找到一种方法来创建执行以下操作的计算列:
如果Col2等于1或3, 然后返回当前行的 Col1 ELSE 返回前一行列的值(Col3/计算列)
有没有办法从计算列中提取值?我尝试过使用 LAG() 并使用递归 CTE,但不知道如何让它工作。
我尝试过(我知道它不正确):
SELECT Record_Number, Col1, Col2,
CASE
WHEN Col2 IN (1, 3) THEN Col1
ELSE LAG(Col3) OVER (ORDER BY Record_Number)
END AS 'Col3'
FROM tbl1
提前致谢!
尝试使用
LAG()
功能失败。
您可以使用递归。
递归的锚点/开始设置为 record_number = 1,条件暂时为 col3 设置,这将在下一步中更改。
然后将此 cte 与输入表连接,以便比较先前的记录,如果条件失败,则获取先前计算的数据。
WITH rec_cte AS (
SELECT
record_number,col1,col2,
CASE WHEN col2 IN (1, 3) THEN col1 ELSE col1 END AS col3
FROM test
WHERE record_number = 1
UNION ALL
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 test t
INNER JOIN rec_cte r ON t.record_number = r.record_number + 1
)
SELECT
record_number,col1,col2,col3
FROM rec_cte
ORDER BY 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 |