我有一个表,它只包含以下字段:timestamp,level
(时间戳,双精度)
这个表是由一个测量实时信号电压的传感器提供数据的。采样频率为1赫兹。
实际样本数据如下:

`2016-05-23 08:00:00+02 | 44.0
 2016-05-23 08:00:01+02 | 43.9
 2016-05-23 08:00:02+02 | 44.1
 2016-05-23 08:00:03+02 | 54.6
 2016-05-23 08:00:04+02 | 61.0
 2016-05-23 08:00:05+02 | 62.2
 2016-05-23 08:00:06+02 | 63.4
 2016-05-23 08:00:07+02 | 62.9
 2016-05-23 08:00:08+02 | 61.9
 2016-05-23 08:00:09+02 | 63.9
 2016-05-23 08:00:10+02 | 44.2
 2016-05-23 08:00:11+02 | 44.0
 2016-05-23 08:00:12+02 | 61.3
 2016-05-23 08:00:13+02 | 62.4
 2016-05-23 08:00:14+02 | 44.3
 2016-05-23 08:00:15+02 | 43.8'

我要实现的是找到一个时间戳,当电压超过60毫伏时,至少有3个后续样本(为了抑制随机尖峰)。该条件在时间2016-05-23 08:00:06+02时满足,因此2016-05-23 08:00:04+02应作为事件开始时间返回。然后我需要找到事件的结束时间,即电压降到60 mV以下的时间。但我想抑制随机下降,所以正确的结束时间戳应该是2016-05-23 08:00:13+02
我试图编写一个使用Postgresql窗口函数的查询,但没有成功。

最佳答案

这是部分解。也许还有改进的余地。

SELECT ts,
       voltage,
       case when min(voltage) over (rows between current row and 3 following) > 60 then 'on' end,
       case when max(voltage) over (rows between current row and 3 following) < 60 then 'off' end
FROM data
ORDER BY ts;

这样可以得到如下结果:
ts | voltage | case | case---------------------+---------+------+------ 2016-05-23 08:00:00 | 44 | | off 2016-05-23 08:00:01 | 43.9 | | 2016-05-23 08:00:02 | 44.1 | | 2016-05-23 08:00:03 | 54.6 | | 2016-05-23 08:00:04 | 61 | on | 2016-05-23 08:00:05 | 62.2 | on | 2016-05-23 08:00:06 | 63.4 | on | 2016-05-23 08:00:07 | 62.9 | | 2016-05-23 08:00:08 | 61.9 | | 2016-05-23 08:00:09 | 63.9 | | 2016-05-23 08:00:10 | 44.2 | | 2016-05-23 08:00:11 | 44 | | 2016-05-23 08:00:12 | 61.3 | | 2016-05-23 08:00:12 | 43.8 | | off 2016-05-23 08:00:13 | 62.4 | | 2016-05-23 08:00:14 | 44.3 | | off
然后,当你处理这个过程时,你会寻找“开”,当你找到它时,你会寻找下一个“关”。(显然,布尔列更有效,但这更适合于说明。)

关于sql - 在Postgresql中查找超出定义级别的值的开始和结束时间戳记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37447532/

10-15 20:44