Sql 更新空列时的技巧
您好,我有以下查询要用以前的值更新列 其中列为空:Sql 更新空列时的技巧,sql,oracle,Sql,Oracle,您好,我有以下查询要用以前的值更新列 其中列为空: UPDATE day_status a SET a.ch_size = ( SELECT LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke FROM day_status b WHERE a.item = b.item AND a.daytime=b.daytime ) WHERE a.ch_size IS NULL AND a.sub_hours = 0.5
UPDATE day_status a
SET a.ch_size =
(
SELECT LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke
FROM day_status b
WHERE a.item = b.item AND a.daytime=b.daytime
)
WHERE a.ch_size IS NULL AND a.sub_hours = 0.5
但由于某些原因,当存在上一个值时,它会设置为null,请参见下面的示例:
Item daytime sub_hours ch_size prev_choke
-------------------------------------------------------
t23 18-Aug-17 03:30:00 0.5 56.8
t23 18-Aug-17 04:00:00 0.5 56.8
t24 18-Aug-17 02:30:00 0.5 40.8
t24 18-Aug-17 04:40:00 0.5 40.8
t24 18-Aug-17 02:30:00 0 45.4
这是表的外观:
Item daytime sub_hours ch_size
-------------------------------------------------------
t23 18-Aug-17 03:30:00 0.5 56.8
t23 18-Aug-17 04:00:00 0.5
t24 18-Aug-17 02:30:00 0.5 40.8
t24 18-Aug-17 04:40:00 0.5
t24 18-Aug-17 02:30:00 0 45.4
t23 19-Aug-17 03:30:00 0.5 70.2
t23 19-Aug-17 04:00:00 0.5
t24 19-Aug-17 02:30:00 0.5 40.8
t24 19-Aug-17 04:40:00 0.5
t24 19-Aug-17 02:30:00 0.2
此表在更新后的外观如下:
Item daytime sub_hours ch_size
-------------------------------------------------------
t23 18-Aug-17 03:30:00 0.5 56.8
t23 18-Aug-17 04:00:00 0.5 56.8
t24 18-Aug-17 02:30:00 0.5 40.8
t24 18-Aug-17 04:40:00 0.5 40.8
t24 18-Aug-17 02:30:00 0 45.4
t23 19-Aug-17 03:30:00 0.5 70.2
t23 19-Aug-17 04:00:00 0.5 70.2
t24 19-Aug-17 02:30:00 0.5 40.8
t24 19-Aug-17 04:40:00 0.5 40.8
t24 19-Aug-17 02:30:00 0.2
哪里有把戏?在Where
子句之后计算lag()
。因此,您可以:
UPDATE day_status ds
SET ch_size = (SELECT prev_choke
FROM (SELECT d2.*,
LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke
FROM day_status ds2
) ds2
WHERE ds.item = ds2.item AND ds.daytime = ds2.daytime
)
WHERE a.ch_size IS NULL AND a.sub_hours = 0.5;
我还假设您打算按白天的项目顺序划分
编辑:
严格地说,你可以加上:
UPDATE day_status ds
SET ch_size = (SELECT prev_choke
FROM (SELECT d2.*,
LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke
FROM day_status ds2
) ds2
WHERE ds.item = ds2.item AND ds.daytime = ds2.daytime
)
WHERE a.ch_size IS NULL AND a.sub_hours = 0.5 AND
EXISTS (SELECT prev_choke
FROM (SELECT d2.*,
LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke
FROM day_status ds2
) ds2
WHERE ds.item = ds2.item AND ds.daytime = ds2.daytime AND
prev_choke IS NOT NULL
) ;
但是,您可能需要采取不同的方法,例如使用merge
在where
子句之后计算lag()
。因此,您可以:
UPDATE day_status ds
SET ch_size = (SELECT prev_choke
FROM (SELECT d2.*,
LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke
FROM day_status ds2
) ds2
WHERE ds.item = ds2.item AND ds.daytime = ds2.daytime
)
WHERE a.ch_size IS NULL AND a.sub_hours = 0.5;
我还假设您打算按白天的项目顺序划分
编辑:
严格地说,你可以加上:
UPDATE day_status ds
SET ch_size = (SELECT prev_choke
FROM (SELECT d2.*,
LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke
FROM day_status ds2
) ds2
WHERE ds.item = ds2.item AND ds.daytime = ds2.daytime
)
WHERE a.ch_size IS NULL AND a.sub_hours = 0.5 AND
EXISTS (SELECT prev_choke
FROM (SELECT d2.*,
LAG(ch_size) OVER (ORDER BY item, daytime) as prev_choke
FROM day_status ds2
) ds2
WHERE ds.item = ds2.item AND ds.daytime = ds2.daytime AND
prev_choke IS NOT NULL
) ;
但是,您可能需要采取不同的方法,例如使用merge
请添加表在更新之前的外观以及您希望它在更新之后的外观。请添加表在更新之前的外观以及您希望它在更新之后的外观。谢谢,让我测试一下,一分钟谢谢Gordon Linoff:它工作得很好,我可以再添加一个条件吗?在“WHERE a.ch_size为NULL,a.sub_hours=0.5”中,我想在先前的值不为NULL的地方添加一个条件,我怎么能做到呢,我相信我们不能在WHERE子句中添加滞后函数?@JoeGreen。我不确定你想要什么条件。它要么在子查询的where
子句中,要么在外部查询的新where
子句中。to Gordon Linoff:谢谢,让我测试一下,一分钟谢谢Gordon Linoff:它工作得很好,我可以在“where a.ch_size为NULL,a.sub_hours=0.5”中再添加一个条件吗,我想在where子句中添加前一个值不为null的地方,我怎么能这样做,我相信我们不能在where子句中添加滞后函数?@JoeGreen。我不确定你想要什么条件。它要么在子查询的where
子句中,要么在外部查询的新where
子句中。