我在 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/