我有一个类似于以下示例的表。我想在具有前一个值的列中重复缺失值(如果有的话)。所以对于这个表:
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 :(得分: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;
以下是条件更新的另一个reference和SQL Fiddle示例。目前我无法运行查询,只能运行构建模式选项。我会尽可能用结果编辑这个答案。
请注意,如果一行中有两个空值,则无效。如果可以,则需要在最近的非空id上加入行。