如何使用前一行的值填充空单元格

时间:2015-07-07 18:07:05

标签: 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      0.32

2 个答案:

答案 0 :(得分:0)

如果表中没有其他字段,则没有固有的顺序来确定哪个是"之前的&#34 ;;如果它是某种价值序列,也许可以做一些事情,但你的最后一行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`;

注意:如果您想要更新表中的值,那就是全部;如果您只是想要一个执行此操作的结果集,那么SELECT中使用的CREATE就足够了。

注意2:这是不可靠的,因为它可能会在"相同的"数据取决于许多因素,例如:用于表的ENGINE或表的历史记录(如果在删除某些行后插入了" last"记录,它可能最终位于"早期"已被删除的行。)

答案 1 :(得分:0)

为了做到这一点,你需要为前一行提供某种标识符。假设(因为我在等待你的例子中'之前'的澄清),假设你有每行的主键标识符:

| 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与前一个匹配,则可以JOIN这两个表,并相应地设置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;

以下是条件更新的另一个referenceSQL Fiddle示例。目前我无法运行查询,只能运行构建模式选项。我会尽可能用结果编辑这个答案。

请注意,如果一行中有两个空值,则无效。如果可以,则需要在最近的非空id上加入行。