SQL Server:当另一列中的另一个数字> 1时,如何用该列中的值更新列

时间:2018-12-05 07:23:44

标签: sql sql-server stored-procedures sql-server-2014

我有一个包含以下数据的表:

Part    Comp   level  item_nbr
-------------------------------
abc     ab      1      1
null    cd      2      2
null    ef      3      3
cde     gh      1      4
null    ij      2      5
null    kl      3      6
null    mn      4      7

我想将空值更新为每个级别1的值,因此,将级别1的值更新为> 1的每个级别。

Part    Comp   level   
---------------------
abc     ab      1     
abc     cd      2  
abc     ef      3  
cde     gh      1    
cde     ij      2  
cde     kl      3  
cde     mn      4 

我不知道如何在非常大的数据集上实现这一目标。任何帮助将不胜感激!

为了解释另一种方式,     零件级别
    abc 1
            2
            3
然后在下一行填充另一部分     efg 1             2             2

进一步的说明:

我需要用字符串“ abc”填充字符串“ abc”,而下面的列字段为空。下一行有一个efg字符串,下面的列字段为null,同样,这些字段应使用值“ efg”填充,依此类推。

级别字段= 1将始终具有部件号,但是所有其他级别报告的级别均为1级部件,因此应相同地填充。并重复。

希望这很有道理。

3 个答案:

答案 0 :(得分:1)

使用具有窗口功能的可更新CTE:

with toupdate as (
      select t.*,
             max(part) over (partition by itm_nbr_not_null) as new_part
      from (select t.*,
                   max(case when part is not null then item_nbr end) over (order by item_nbr) as itm_nbr_not_null
            from t
           ) t
     )
update toupdate
    set part = new_part
    where part is null;

您可以运行CTE以查看发生了什么情况。

答案 1 :(得分:0)

好吧,从我所理解的问题出发,您需要更新null列的值,直到获得一个非null的值。您想将其继续到表格的最后一行。 在这种情况下,我创建了一个存储过程,在该存储过程中,我读取每个第n个单元格的值(如果为空),则使用上一个值进行更改。单元格不为null时的单元格值。

方法:

  1. 创建一个临时表/表变量。

  2. 添加了一个额外的列,该列基本上是标识,这将有助于对该列进行排名。

  3. 反复循环直到达到最大行数。

  4. 在每次迭代中,读取第i行的单元格值

    4.1如果不为null,则将其放入一个临时变量中。

    4.2否则,用临时变量替换/更新第i个单元格的值

  5. 继续操作,直到到达表/表变量的最后一行。

看看我的以下片段:

create proc DemoPost
as
begin
declare @table table(serial_no int identity(1,1), name varchar(30), text varchar(30), level int)
insert @table
select Name, Text, Level from Demo
declare @max as int = (select max(serial_no) from @table)
--select @max
declare @i as int =0
declare @temp as varchar(30)
declare @text as varchar(30)

while @i < @max
begin   
    set @i = @i +1
    set @temp = (select name from @table where serial_no = @i)
    -- if @temp is not null, fetch its value, otherwise, update/replace it with 
    -- previously gotten not-null cell's value.
    if @temp is not null
    begin
        set @text = (select name from @table where serial_no = @i)
    end
    else
    begin
        update @table
        set name = @text where serial_no = @i 
    end
end

select name, text, level from @table
end

答案 2 :(得分:0)

您可以根据给定的情况使用临时表进行更新,我认为item_nbr在行中是唯一的,希望对您有帮助

    <?php
/* Create new object */
$im = new Imagick();

/* Create new checkerboard pattern */
$im->readImage('test.jpg'); 

/* Set the image format to png */
$im->setImageFormat('png');

/* Fill new visible areas with transparent */
$im->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);

/* Activate matte */
$im->setImageMatte(true);

/* Control points for the distortion */
$controlPoints = array(500, 30, 133,150,90,2800);
/*size, inner-circle, padding links, padding-top (jeweils Mittelpunkt), wie weit, */


/* Perform the distortion */                       
$im->distortImage(Imagick::DISTORTION_POLAR, $controlPoints, true);



/* Ouput the image */
header("Content-Type: image/png");
echo $im;
?>