假设我有一个看起来像这样的数据框
|------|------|------|------|------|------|------|------|------|------|------|
| t_0 | t_1 | t_2 | t_3 | t_4 | t_5 | t_6 | t_7 | t_8 | t_9 | t_10 |
|------|------|------|------|------|------|------|------|------|------|------|
| 1 | N/A | N/A | N/A | 6 | N/A | N/A | 8 | 14 | 3 | N/A |
|------|------|------|------|------|------|------|------|------|------|------|
| N/A | 6 | 9 | 2 | 5 | N/A | 8 | 8 | 8 | N/A | N/A |
|------|------|------|------|------|------|------|------|------|------|------|
| 6 | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
|------|------|------|------|------|------|------|------|------|------|------|
| N/A | N/A | 9 | N/A | N/A | 3 | N/A | N/A | N/A | N/A | N/A |
|------|------|------|------|------|------|------|------|------|------|------|
我想从左到右进行水平填充
|------|------|------|------|------|------|------|------|------|------|------|
| t_0 | t_1 | t_2 | t_3 | t_4 | t_5 | t_6 | t_7 | t_8 | t_9 | t_10 |
|------|------|------|------|------|------|------|------|------|------|------|
| 1 | 1 | 1 | 1 | 6 | 6 | 6 | 8 | 14 | 3 | 3 |
|------|------|------|------|------|------|------|------|------|------|------|
| N/A | 6 | 9 | 2 | 5 | 5 | 8 | 8 | 8 | 8 | 8 |
|------|------|------|------|------|------|------|------|------|------|------|
| 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
|------|------|------|------|------|------|------|------|------|------|------|
| N/A | N/A | 9 | 9 | 9 | 3 | 3 | 3 | 3 | 3 | 3 |
|------|------|------|------|------|------|------|------|------|------|------|
这样代码可以推广到任意数量的列(此处显示为11,但我需要它可以用于任何数字)
编辑:原始数据已经标准化,但我制作的算法过去只能在spark之外运行,这就是数据分散的原因
答案 0 :(得分:1)
请记住,查询速度非常慢。 如果您有选择,请不要使用它
SELECT
@x:=t_0,
IF(t_1 IS NULL,@x, @x:=t_1),
IF(t_2 IS NULL,@x, @x:=t_2),
IF(t_3 IS NULL,@x, @x:=t_3),
IF(t_4 IS NULL,@x, @x:=t_4),
IF(t_5 IS NULL,@x, @x:=t_5),
IF(t_6 IS NULL,@x, @x:=t_6),
IF(t_7 IS NULL,@x, @x:=t_7),
IF(t_8 IS NULL,@x, @x:=t_8),
IF(t_9 IS NULL,@x, @x:=t_9),
IF(t_10 IS NULL,@x, t_10),
FROM t
在大多数情况下,你应该在你的后端语言(php,java,.net,等等)上应用这种计算和替换。尝试仅从MySQL获取原始数据,但不要将其用作常规语言或Excel工作表。拆分从转换和表示数据流程中获取数据流程。这是两件不同的事情。这对你来说似乎并不明显,但随着时间的推移,你会喜欢这种分离(我希望,我希望你: - ))
答案 1 :(得分:0)
这是@ Alex的答案的扩展版本,适用于任何给定的表格。正如大家到目前为止所提到的,数据应该正常化。看到所有这一切的复杂性应该有希望澄清为什么这是一个坏主意。
SET @db = 'demo';
SET @table = 'test';
SET @firstColumn = (SELECT column_name FROM information_schema.columns WHERE table_schema=@db AND table_name=@table ORDER BY ordinal_position LIMIT 1);
SET @query = CONCAT('SELECT @x:=',@firstColumn,',');
SELECT @query := CONCAT(@query,'IF(',column_name,' IS NULL,@x, @x:=',column_name,'),') FROM information_schema.columns WHERE table_schema=@db AND table_name=@table ORDER BY ordinal_position;
SET @query = CONCAT( MID(@query,1,LENGTH(@query)-1),' FROM ',@db,'.',@table);
PREPARE statement FROM @query;
EXECUTE statement;