Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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
Mysql 如何用前几行中的值填充空单元格_Mysql_Sql - Fatal编程技术网

Mysql 如何用前几行中的值填充空单元格

Mysql 如何用前几行中的值填充空单元格,mysql,sql,Mysql,Sql,我有一个表,看起来像下面的例子。我想用上一个值来替换列中缺少的值(如果有)。所以对于这个表: col1 col2 0.1 0.2 0.23 0.53 - 0.46 0.77 - - 0.32 我预期会有以下结果: col1 col2 0.1 0.2 0.23 0.53 0.23 0.46 0.77 0.46 0.77

我有一个表,看起来像下面的例子。我想用上一个值来替换列中缺少的值(如果有)。所以对于这个表:

 col1      col2    

 0.1       0.2
 0.23      0.53
  -        0.46
 0.77       - 
   -       0.32
我预期会有以下结果:

 col1      col2

 0.1       0.2
 0.23      0.53
 0.23      0.46
 0.77      0.46 
 0.77      0.32

如果表中没有其他字段,则没有确定哪一个字段是“先前”字段的固有顺序;如果它是某种类型的值序列,也许可以做些什么,但最后一行0.32表明不是这样

这个非常不可靠的脚本可能适合您

SET @a := 0;
SET @b := 0;
CREATE TEMPORARY TABLE `tmp`
SELECT @a := IFNULL(col1, @a) AS col1, @b := IFNULL(col2, @b) AS col2
FROM the_table
;
TRUNCATE TABLE the_table;
INSERT INTO the_table (col1, col2)
SELECT col1, col2
FROM tmp
;
DROP TEMPORARY TABLE `tmp`;
注意:如果要更新表中的值,则全部为;如果您只需要一个这样做的结果集,只需在
创建
中使用
选择
即可


注2:这是不可靠的,因为它可能会根据许多因素对“相同”数据返回不同的结果,例如:表所用的引擎或表的历史记录(如果“最后”记录是在删除某些行后插入的,它可能最终位于删除的“较早”行的位置)。

为此,您需要上一行的某种标识符。假设(因为我正在等待您的示例中“previous”的澄清),假设您每行都有一个主键标识符:

| id | col1 | col2 |
+----+------+------+
| 1  | 0.1  | 0.2  |
| 2  | 0.23 | 0.53 |
| 3  | null | 0.46 |
| 4  | 0.77 | null |
| 5  | null | 0.32 |
您可以使用上一个主键中的值来更新表。在id与前一个表匹配的条件下,可以
连接这两个表,并相应地设置col1值,如下所示:

UPDATE myTable m
JOIN myTable mt ON (m.id - 1) = mt.id
SET m.col1 = mt.col1 WHERE m.col1 IS NULL;
要对同一更新查询中的两列执行此操作,需要添加
IF
语句:

UPDATE myTable m
JOIN myTable mt ON (m.id - 1) = mt.id
SET m.col1 =
  CASE WHEN m.col1 IS NULL THEN
    mt.col1
  ELSE
    m.col1
  END,
  m.col2 = 
  CASE WHEN m.col2 IS NULL THEN
    mt.col2
  ELSE 
    m.col2
  END;
下面是另一个关于条件更新的例子。目前我无法运行查询,只能运行buildschema选项。当我可以的时候,我会用结果编辑这个答案


请注意,如果一行中有两个空值,这将不起作用。如果可能的话,您需要将最新的非空id上的行连接起来。

您能澄清一下这里的顺序吗?我无法确定您是否按col1的升序排序。在正确的数据库设计中,行的顺序应该无关紧要。我认为这是可行的,但它需要更清楚什么是“以前的值”,什么定义了以前的值,而不仅仅是你从视觉上看它。我理解你的意思,但我认为这应该是一个评论(就像我留下的评论一样)。事实上,你是对的,这是不可能做到的,但我怀疑可以通过澄清来帮助实现这一点。我还要补充一个非常不可靠的答案。(在这种情况下,没有这样的方法来确定下一个值。只要复制上面的值,如果任何字段在@Uueerdo中丢失了很多anks,我会尝试使用this@ita我很高兴能帮上忙。如果这是可行的,请点击答案旁边的复选标记接受答案,这样将来的读者就会知道是什么解决了你的问题。我肯定会接受这个答案,这将帮助我解决我的问题