如何解决在 MSSQL
源表
Row_no | 旗帜 | Curr_value | Prev_value |
---|---|---|---|
1 | C | V1 | NULL |
2 | P | V11 | NULL |
3 | P | V12 | NULL |
4 | C | V2 | NULL |
5 | C | V31 | NULL |
6 | P | V32 | NULL |
我有一个场景,我必须将前一行值与当前行值进行比较,并根据案例条件更新 Curr_value 列,并且应该为表中的所有记录导出 curr_value 和 Prev_value。
用于派生 Curr_value 列的条件是 case when (Flag='C') then curr_value else Prev_value end 并且我在 MSsql 中使用 LAG 函数来获取上一个值列。
Row_no | 旗帜 | Curr_value | Prev_value |
---|---|---|---|
1 | C | V1 | 0 |
2 | P | V1 | V1 |
3 | P | V1 | V1 |
4 | C | V2 | V1 |
5 | C | V3 | V2 |
6 | P | V3 | V3 |
我尝试使用 While 循环实现相同的功能,但执行时间非常长。请告诉我是否可以在不使用 MSsql 中的循环的情况下实现相同的输出。
解决方法
我将以下脚本设置为一个完整的工作示例:
CREATE TABLE #tmpSampleData(
Row_no int NOT NULL PRIMARY KEY,Flag varchar(1) NULL,Curr_value varchar(3) NULL
);
INSERT INTO #tmpSampleData (Row_no,Flag,Curr_value)
VALUES (1,'C','V1'),(2,'P',(3,(4,'V2'),(5,'V3'),(6,'V3');
SELECT
sample_data.Row_no,sample_data.Flag,sample_data.Curr_value,LAG(sample_data.Curr_value,1,'0') OVER(ORDER BY sample_data.Row_no) AS Prev_value,CASE
WHEN sample_data.Flag = 'C'
THEN sample_data.Curr_value
ELSE LAG(sample_data.Curr_value,'0') OVER(ORDER BY sample_data.Row_no)
END AS CalculatedField
FROM
#tmpSampleData AS sample_data;
IF OBJECT_ID(N'tempdb..#tmpSampleData',N'U') IS NOT NULL
BEGIN
DROP TABLE #tmpSampleData;
END;
但我认为您在这里感兴趣的主要部分是这样的:
CASE
WHEN sample_data.Flag = 'C'
THEN sample_data.Curr_value
ELSE LAG(sample_data.Curr_value,'0') OVER(ORDER BY sample_data.Row_no)
END AS CalculatedField
只需添加 sample_data.Flag = 'C'
的条件,然后返回 Curr_value
或`LAG 的结果
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。