我们正在收集大量传感器数据并将其记录到postgres数据库中。
基本架构 - 减少:
id | BIGINT PK
sensor-id| INT FK
location-id | INT FK
sensor-value | NUMERIC(0,2)
last-updated | TIMESTAMP_WITH_TIMEZONE
我试图在最后一天获得传感器数据的最大变化。我的意思是,在所有传感器中,传感器ID 4,5,6,7与前一天相比变化最大。在此之前,我试图通过SQL查询来确定上次阅读和最新阅读之间的差异。
我想也许主导和滞后函数会有所帮助,但我的查询并没有给我我追求的结果:
SELECT
srd.last_updated,
spi.title,
lead(srd.value) OVER (ORDER BY srd.sensor_id DESC) as prev,
lag(srd.value) OVER (ORDER BY srd.sensor_id DESC) as next
FROM
sensor_rt_data srd
join sensor_prod_info spi on srd.sensor_id = spi.id
where srd.last_updated >= NOW() - '1 day'::INTERVAL -- current_date - 1
ORDER BY
srd.last_updated DESC
简单数据集 - 现在正在进行此操作,因为我现在无法登录数据库:
id|sensor,location,value,updated
1|1,1,24,'2017-04-28 19:30'
2|1,1,22,'2017-04-27 19:30'
3|2,1,35,'2017-04-28 19:30'
4|2,1,33,'2017-04-28 08:30'
5|2,1,31,'2017-04-27 19:30'
6|1,1,25,'2017-04-26 19:30'
忘记连接(用户友好的传感器标签名称字段工作人员需要的位置和位置),我如何锻炼哪个传感器报告了他们的时间序列中温度的最大变化#39 ;按传感器ID分组?
我期待:
updated,sensor,prev,next
'2017-04-28 19:30',1,24,22
'2017-04-28 19:30',2,33,31
(然后,我可以减去并命令锻炼已经改变的前10个传感器)
我注意到Postgres 9.6也有其他一些功能,但是想先尝试使用Lead / Lag。
答案 0 :(得分:0)
窗口功能不适合这种任务。试试这个:
select sensor, max(value)-min(value) as value_change
from sensordata
where updated>=?-'1 day'::interval
group by sensor
order by value_change desc
limit 1;
对于此类查询,updated
以外的索引使用不多。如果您在一个日历日而不是过去24小时内查看最大的更改,则可能会使用特制索引。