【问题标题】:Update based on previous value SQL SERVER 2005根据以前的值 SQL SERVER 2005 更新
【发布时间】:2014-10-27 10:19:12
【问题描述】:

我需要更新这些 NULL 值:

PK |  CODE
---+-------
1  |   20
2  |   NULL
3  |   NULL
4  |   30
5  |   NULL
6  |   NULL
7  |   NULL
8  |   40
9  |   NULL

像这样:

PK   |   CODE
-----+------------
1    |    20
2    |    20
3    |    20
4    |    30
5    |    30
6    |    30
7    |    30
8    |    40
9    |    40

它应该始终基于最后一个最小值。

我已经尝试了下面的代码,但它只是更新了开头有值的那一行之前的第一行。

查询

UPDATE TT 
SET CODE = (SELECT CODE 
FROM #TSPV_TEMP T2 with(nolock)
WHERE T2.KEY = (tt.KEY -1))
FROM #TSPV_TEMP TT with (nolock)
WHERE tt.CODE IS NULL

【问题讨论】:

    标签: sql sql-server sql-server-2005 sql-update logic


    【解决方案1】:

    你可以这样做:

    UPDATE TT 
        SET CODE = (SELECT TOP 1 CODE
                    FROM #TSPV_TEMP T2 with(nolock)
                    WHERE T2.KEY < tt.KEY AND
                          CODE IS NOT NULL
                    ORDER BY KEY DESC
                   )
        FROM #TSPV_TEMP TT with (nolock)
        where tt.CODE IS NULL;
    

    注意子查询中的差异。这会查找 CODE 的先前非 NULL 值以进行更新。

    【讨论】:

    • 谢谢@GordonLinoff,实际上它几乎成功了。我只需要做一点改变:((T2.KEY
    【解决方案2】:
    update tbl
       set code =
           (select code
              from tbl x
             where x.pk = (select max(y.pk)
                             from tbl y
                            where y.pk < tbl.pk
                              and code is not null))
     where code is null;
    

    小提琴: http://sqlfiddle.com/#!3/3803d/1/0

    【讨论】:

      【解决方案3】:

      另一种使用派生表的方法,该表对于每个具有空代码的 pk 包含具有非空代码的最大较小 pk。

      update t1
      set t1.code = t3.code
      from tt t1 join
          (select t1.pk, max(t2.pk) max_pk
          from tt t1
          join tt t2 on t1.pk > t2.pk
          and t2.code is not null
          and t1.code is null
          group by t1.pk) t2 on t2.pk = t1.pk
      join tt t3 on t3.pk = t2.max_pk
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-29
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 2019-09-05
        相关资源
        最近更新 更多