SQL查询将时间序列测量分组为单个记录?

时间:2016-04-09 23:23:54

标签: 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并在前端控制台上显示数据。例如,客户端可以在可下载的CSV中以五分钟的间隔从传感器2和3请求特定时间段的所有数据。我想将此作为具有公共(舍入)时间戳的单个查询执行:

<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查询。

1 个答案:

答案 0 :(得分:0)

对于任何有类似问题的人,我最后稍微修改了@Gordon Linoff的优秀答案,将测量值分组为圆形时间戳(接受答案中的查询将给出相隔5分钟的桶,但不是像1那样的舍入时间:00:00,1:05:00等。我用过:

select timestamp,
   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 unix_timestamp(timestamp) div 300;

希望这有助于其他人。