我有一个包含以下数据的表:
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级部件,因此应相同地填充。并重复。
希望这很有道理。
答案 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时的单元格值。
方法:
创建一个临时表/表变量。
添加了一个额外的列,该列基本上是标识,这将有助于对该列进行排名。
反复循环直到达到最大行数。
在每次迭代中,读取第i行的单元格值
4.1如果不为null,则将其放入一个临时变量中。
4.2否则,用临时变量替换/更新第i个单元格的值
继续操作,直到到达表/表变量的最后一行。
看看我的以下片段:
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;
?>