上一行列(计算列)的返回值

问题描述 投票:0回答:1

我有下面的数据集

记录_编号 第 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()
功能失败。

sql sql-server
1个回答
0
投票

您可以使用递归。

递归的锚点/开始设置为 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
© www.soinside.com 2019 - 2024. All rights reserved.