mysql - SQL 查询将时间序列测量结果分组到单个记录中?

标签 mysql sql sqlalchemy

我在 MySQL 数据库中有一个表,其中包含大约 30 秒间隔内多个传感器的测量值,每个传感器都有一个时间戳,如下所示:

<timestamp, source_device, measurement>
<2016-04-01 01:00:00.1234, sensor 1, 1.234>
<2016-04-01 01:00:01.5467, sensor 2, 2.543>
<2016-04-01 01:00:00.8376, sensor 3, 1.318>
<2016-04-01 01:00:31.7365, sensor 2, 1.927>
<2016-04-01 01:00:30.2610, sensor 1, 2.701>
<2016-04-01 01:00:30.9576, sensor 3, 1.853>

请注意,前 3 条记录大致在同一时间,尽管时间戳并不完全匹配。我需要导出摘要 CSV 并在前端控制台上显示数据。例如,客户端可能以五分钟的间隔从传感器 2 和 3 请求特定时间段内的所有数据(以可下载的 CSV 形式)。我想将其作为具有公共(public)(四舍五入)时间戳的单个查询来执行:

<timestamp, sensor_2_measurement, sensor_3_measurement>
<2016-04-01 01:00, 2.543, 1.318>
<2016-04-01 01:05, 3.015, 1.692>
<2016-04-01 01:10, 2.752, 1.494>

目前,我正在对每个传感器进行单独的查询,但这需要我在构建 CSV 之前将完整的查询结果加载到内存中,并且对将 CSV 行拼接在一起的应用程序造成一些压力。有没有办法将其归结为单个查询? sqlalchemy 实现的加分项,但我可以使用纯 SQL 查询。

最佳答案

以下获取每个时间单位的平均值,四舍五入为 5 分钟间隔:

select FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp)/(24*60/5))*(24*60/5)) as ts,
       avg(case when source_device = 1 then measurement end) as sensor_1,
       avg(case when source_device = 2 then measurement end) as sensor_2,
       avg(case when source_device = 3 then measurement end) as sensor_3
from t
group by ts;

关于mysql - SQL 查询将时间序列测量结果分组到单个记录中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523922/

相关文章:

php - Wordpress - 使用元数据获取邮政编码并输出谷歌地图

mysql - 如果在重复键更新时插入

sql - SQL Server 中的 MS Project 数据

python - 尝试使用 Python 将数据插入 MySQL 表时出现编程错误

python - SQLAlchemy 使用现有主键创建新对象

mysql - 了解自连接

mysql - 奇怪的SQL结果order by date, count(date)

php - 查询输出未显示在页面上

python - sqlalchemy 级联保存更新

mysql - 按最后 4 个字符分组并显示该组