列作为与另一列连接的行

Posted

技术标签:

【中文标题】列作为与另一列连接的行【英文标题】:Column as row concatenated with another column 【发布时间】:2016-09-28 12:18:27 【问题描述】:

所以我必须使用以时间为列的数据库(在特定日期每 10 分钟有一列),这里的 id 不是主键,即使它是唯一的(并且是主键) 在另一个表中。行数等于一天。 因此,我希望将每个时间段的值与它的日期时间放在一起。

这可能吗? 我可以编写一个小程序,用我需要的东西重新创建一个表,但我希望尽可能少地重复数据。

我有什么:

+---+----------+-----+-----+-----+-----+
|ID |   DATE   |00h00|00h10|00h20|00h30|
+---+----------+-----+-----+-----+-----+
|1  |2016-09-28|80   |79   |75   |73   |
+---+----------+-----+-----+-----+-----+
|1  |2016-09-27|82   |80   |76   |74   |
+---+----------+-----+-----+-----+-----+

我想要什么:

+---+----------------+-----+
|ID |        DATE    |VALUE|
+---+----------------+-----+
|1  |2016-09-28 00h00|80   |
|1  |2016-09-28 00h10|79   |
|1  |2016-09-28 00h20|75   |
|1  |2016-09-28 00h30|73   |
+---+----------------+-----+
|1  |2016-09-28 00h00|82   |
|1  |2016-09-28 00h10|80   |
|1  |2016-09-28 00h20|76   |
|1  |2016-09-28 00h30|74   |
+---+----------------+-----+

【问题讨论】:

【参考方案1】:

最简单的方法是使用union all

select id, date_add(date, interval 0 minute) as date, `00h00` as value from t union all
select id, date_add(date, interval 10 minute) as date, `00h10` as value from t union all
. . .

如果你有一个数字表,你也可以这样做:

select t.id, date_add(date, interval (n.n - 1) * 10 minute) as date,
       (case when n = 1 then `00h00`
             when n = 2 then `00h10`
             . . .
        end) as value
from t join
     numbers n
     on n.n < 24 * 6;

如果不以某种方式列出所有列,我认为没有任何方法可以在 mysql 中执行此操作。您可以使用其他查询或电子表格来生成 SQL。

【讨论】:

你是个天才!它有效,有点难看,因为它们是 24*6 列,但是谢谢! 你的答案只是一个小错误,它是date_add()而不是dateadd(),顺便说一句,表格数字意味着00h0000h10 ...?

以上是关于列作为与另一列连接的行的主要内容,如果未能解决你的问题,请参考以下文章

使用 PySpark 连接与另一列中的两列确定的范围相匹配的数据框

Excel:VLOOKUP 将一列与另一张表匹配并连接数据

我需要连接三个表,将结果按一列分组,并显示另一列的最大值

SQL LEFT JOIN 与另一列的 where 子句

将一列中的文本与另一列匹配(vlookup + like)

仅返回一列中的日期与另一列中的日期最接近的行?