2

我有一张这样的桌子

ac  asg     asgc    asgdt
1   abc     abc     2012-06-01 00:00:00.000
1   NULL    NULL    2012-06-02 00:00:00.000
1   xyz     xyz     2012-07-01 00:00:00.000
1   NULL    NULL    2012-07-02 00:00:00.000
2   NULL    NULL    2012-07-03 00:00:00.000
2   lmn     lmn     2012-08-01 00:00:00.000
2   NULL    NULL    2012-08-02 00:00:00.000

我必须通过重复以前的文本来删除空值,所以我写了

Declare @asgc nvarchar(10)
UPDATE coalescetest 
SET 
    @asgc = COALESCE(asgc, @asgc),
    asgc = COALESCE(asgc, @asgc)

这段代码给了我下面的输出

ac  asg     asgc
1   abc     abc
1   NULL    abc
1   xyz     xyz
1   NULL    xyz
2   NULL    xyz
2   lmn     lmn
2   NULL    lmn

这里的问题是,它应该在帐户级别重复以前的文本。可以看出, 1 的'xyx'ac重复为ac2。这不应该发生。理想的输出应该是这样的

ac  asg     asgc
1   abc     abc
1   NULL    abc
1   xyz     xyz
1   NULL    xyz
2   NULL    NULL
2   lmn     lmn
2   NULL    lmn

ac所以,我在级别上写了一个循环。但它正在扼杀性能。任何人都可以提出一条出路。提前致谢。

4

1 回答 1

5

这有效:

declare @tab table (ac int not null, asg char(3) null, asgc char(3) null, asgdt datetime not null)
insert into @tab(ac,asg,asgc,asgdt) values
(1,'abc','abc','2012-06-01 00:00:00.000'),
(1,NULL,NULL,'2012-06-02 00:00:00.000'),
(1,'xyz','xyz','2012-07-01 00:00:00.000'),
(1,NULL,NULL,'2012-07-02 00:00:00.000'),
(2,NULL,NULL,'2012-07-03 00:00:00.000'),
(2,'lmn','lmn','2012-08-01 00:00:00.000'),
(2,NULL,NULL,'2012-08-02 00:00:00.000')

update
    t1
set
    asgc = t2.asgc
from
    @tab t1
        inner join
    @tab t2
        on
            t1.ac = t2.ac and   --Belong to same account
            t2.asgc is not null and --Has a useful value
            t2.asgdt < t1.asgdt   --Is an earlier row
        left join
    @tab t3
        on
            t1.ac = t3.ac and   --Belong to same account
            t3.asgc is not null and --Has a useful value
            t3.asgdt < t1.asgdt and   --Is an earlier row
            t3.asgdt > t2.asgdt   --But occurs later than t2
where
    t1.asgc is null and --Needs a fill-in value
    t3.ac is null   --And no better matching row was found for the replacement

select * from @tab

结果:

ac          asg  asgc MysteriousUnamedColumn
----------- ---- ---- -----------------------
1           abc  abc  2012-06-01 00:00:00.000
1           NULL abc  2012-06-02 00:00:00.000
1           xyz  xyz  2012-07-01 00:00:00.000
1           NULL xyz  2012-07-02 00:00:00.000
2           NULL NULL 2012-07-03 00:00:00.000
2           lmn  lmn  2012-08-01 00:00:00.000
2           NULL lmn  2012-08-02 00:00:00.000

请注意,我绝不依赖实际UPDATE应用于表格的顺序。


刚刚意识到,根据问题的标题,我的答案当然并没有真正使用。 COALESCE但是,TBH,无论如何,这对于手头的工作来说是错误的工具。您可以重新编写上述查询以使用 a COALESCE,并让它更新所有行,而不仅仅是那些具有NULL值的行,但我想不出任何合理的理由这样做。

于 2012-07-05T06:18:25.643 回答