MSSQL(SQL SERVER 16)基于非int值更新行的范围

时间:2017-06-19 17:26:35

标签: sql sql-server sql-server-2016

是否可以根据文本更新一系列行?The table on the left is the data that has been imported. Table on the right is the end goal. [编辑]:左侧的表格是已导入的数据。右边的表是最终目标。

B列,值ISA-IEA用于指定EDI订单的开始和结束(简化)。实际数据在行数中是可变的,因此有时可能有5行,有时是45行。所以我不能简单地选择5 ROW然后转到下一个。 谢谢你的任何指示。

编辑澄清:我将离开原始示例,并包含此附加示例。左边的表格是当前数据,我想要完成的是正确的。谢谢! enter image description here

1 个答案:

答案 0 :(得分:1)

你只需要捕获最顶层(通过E列desc)行,其中B等于ISA。 方法如下:

drop table if exists dbo.Test;

create table dbo.Test (
    A int
    , B varchar(100)
    , C varchar(100)
    , D varchar(100)
    , E int
);

insert into dbo.Test (A, B, C, D, E)
values (null, 'ISA', '170607', 48, 1)
    , (null, 'BFR', '170607', 1, 2)
    , (null, 'FST', '170607', 1, 3)
    , (null, 'IEA', '170607', 48, 4)
    , (null, 'ISA', '170607', 49, 5)
    , (null, 'BFR', '170607', 1, 6)
    , (null, 'FST', '170607', 1, 8)
    , (null, 'FST', '170607', 1, 9)
    , (null, 'IEA', '170607', 49, 10);

update tu
set
    A = tc.D
from dbo.Test t
    outer apply (
            select
            top (1)
                tt.D
            from dbo.Test tt
            where tt.B = 'ISA'
                and tt.E <= t.E
            order by tt.E desc
    ) tc
    inner join dbo.Test tu on t.E = tu.E

select
*
from dbo.Test t