Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新空列时的技巧_Sql_Oracle - Fatal编程技术网

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
子句中。