mysql - 旋转一个表并显示 n 个有序的时间序列

标签 mysql time-series pivot-table

我有一个名为“readings”的表,其中包含来自具有以下列的传感器的数据:

id    id_device    date                   value
1     1            2015-01-01 00:00:00    0.2
2     2            2015-01-01 00:00:00    0.7
3     1            2015-01-01 00:00:10    0.3
4     2            2015-01-01 00:00:10    0.8
5     1            2015-01-01 00:00:20    0.4
6     2            2015-01-01 00:00:20    0.9

我想在单个查询中将其转换为该表:

date                   device_id_1     device_id_2
2015-01-01 00:00:00    0.2             0.7
2015-01-01 00:00:10    0.3             0.8
2015-01-01 00:00:20    0.4             0.9

我发现这样做被称为“透视表”,但我只发现了如何对值求和,而不是如何按时间序列对它们进行排序

我试过了

SELECT DISTINCT(date) FROM readings

然后在结果循环中,再次查询每个传感器

SELECT value FROM readings WHERE date=$date AND id_device=$id

但我确信这不是很有效,因为它有很多查询(每个值一个查询)

sql查询会是什么样的?

最佳答案

试试这个:

SELECT r.id,
       r.`date`,
       GROUP_CONCAT(IF(r.device_id = 1,r.`VALUE`,NULL)) AS device_id_1,
       GROUP_CONCAT(IF(r.device_id = 2,r.`VALUE`,NULL)) AS device_id_2
FROM readings r
GROUP BY r.`DATE`
ORDER BY r.`DATE` ASC;

+----+---------------------+-------------+-------------+
| id | date                | device_id_1 | device_id_2 |
+----+---------------------+-------------+-------------+
|  1 | 2015-10-01 10:00:00 | 2           | 0.5         |
|  3 | 2015-10-01 10:01:00 | 3.1         | 7.5         |
+----+---------------------+-------------+-------------+
2 rows in set (0.00 sec)

这里是动态 device_id 的版本

SELECT  group_concat( 
    "GROUP_CONCAT(IF(device_id = ",
    device_id,",`value`,NULL)) AS device_id_",
    device_id
    SEPARATOR ',\n') INTO @sql_mid
FROM (SELECT DISTINCT device_id FROM readings ORDER BY device_id) AS r
ORDER BY device_id;

SELECT CONCAT("SELECT id, `date`, ", @sql_mid, " FROM readings GROUP BY `DATE` ORDER BY `DATE` ASC") INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

它生成所有列

+----+---------------------+-------------+-------------+-------------+
| id | date                | device_id_1 | device_id_2 | device_id_3 |
+----+---------------------+-------------+-------------+-------------+
|  1 | 2015-10-01 10:00:00 | 2           | 0.5         | NULL        |
|  3 | 2015-10-01 10:01:00 | 3.1         | 7.5         | NULL        |
|  5 | 2015-10-01 10:11:00 | NULL        | NULL        | 9.9         |
+----+---------------------+-------------+-------------+-------------+
3 rows in set (0.00 sec)

关于mysql - 旋转一个表并显示 n 个有序的时间序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33350524/

相关文章:

R计算每年超标的天数

java - Apache POI XSSFPivotTable setDefaultSubtotal

mysql - 如何在 MySQL 中返回数据透视表输出?

python - sqlalchemy.exc.ProgrammingError : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version

python - 连接到远程数据库后,迁移出现错误 : Errno61, 连接被拒绝

mysql - 在 mysql 的 Select If 条件中使用更新查询

php - MySQL 中的序列化类型

python - 如何转换存储为两列(开始、结束)的日期范围以创建新的行索引并创建值的累积率?

python - pandas中大数据集的数据准备

c# - 使用 Linq 在两个嵌套 List<T> 中透视数据