mysql - 列作为与另一列连接的行

标签 mysql sql unpivot

所以我必须使用一个以时间为列的数据库(特定日期每 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   |
+---+----------------+-----+

最佳答案

最简单的方法是使用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。

关于mysql - 列作为与另一列连接的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747309/

相关文章:

php - 拉维尔 : How to count in query

java - 调用execute()时PreparedStatement与记录不匹配

java - 当用户在我的 Spring Web 应用程序上更新他们的个人资料图片并更新他们的个人资料时,属于该用户的列表中的对象将被复制

mysql - 如何将本地 MSSQL 查询的结果传递到链接的 MySQL 数据库的查询字符串中

python - 使用 Pandas (UNPIVOT)将表格更改为高格式

python - Pandas 'partial melt' 或 'group melt'

php - 了解 url 缩短函数

java - 没有合适的驱动程序

sql - 选择 SUM 和具有最大值的列

sql - 在 SQL Server 中将行数据转换为列