MySQL - 如何水平填充列

时间:2018-01-23 17:14:00

标签: mysql

假设我有一个看起来像这样的数据框

|------|------|------|------|------|------|------|------|------|------|------|
| 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之外运行,这就是数据分散的原因

2 个答案:

答案 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;