0

我们正在收集大量传感器数据并将它们记录到 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'

忘记加入(这是为了用户友好的传感器标签名称,现场工作人员需要和位置),我如何确定哪个传感器在按传感器 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 工作。

4

1 回答 1

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 小时的最大变化,则可能可以使用特制索引。

于 2017-04-29T17:10:56.710 回答