微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 MSSQL

如何解决在 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 举报,一经查实,本站将立刻删除。