【发布时间】:2019-08-14 01:00:03
【问题描述】:
在 PostgreSQL 中,我试图找到具有低于 60 的值序列的主题,然后是随后出现的两个高于 60 的连续值。我还对第一个低于 60 的记录值和第二个高于 60 的值之间的时间长度感兴趣。对于每个主题,此事件可能发生多次。
我正在努力找出如何搜索无限数量的值 = 60。
RowID SubjectID Value TimeStamp
1 1 65 2142-04-29 12:00:00
2 1 58 2142-04-30 03:00:00
3 1 55 2142-04-30 04:00:00
4 1 54 2142-04-30 05:00:00
5 1 55 2142-04-30 06:15:00
6 1 56 2142-04-30 06:45:00
7 1 65 2142-04-30 07:00:00
8 1 65 2142-04-30 08:00:00
9 2 48 2142-05-04 03:30:00
10 2 48 2142-05-04 04:00:00
11 2 50 2142-05-04 05:00:00
12 2 69 2142-05-04 06:00:00
13 2 68 2142-05-04 07:00:00
14 2 69 2142-05-04 08:00:00
15 2 50 2142-05-04 09:00:00
16 2 55 2142-05-04 10:00:00
17 2 50 2142-05-04 10:30:00
18 2 67 2142-05-04 11:00:00
19 2 67 2142-05-04 12:00:00
我目前的尝试使用了滞后和领先功能,但是当我不确定我需要向前看多远时,我不确定如何使用这些功能。这是一个向前看一个值和向后看一个值的例子。我的问题是我不知道如何按subjectID 进行分区以查看“t”时间点,其中每个主题的“t”可能不同。
select t.subjectId, t.didEventOccur,
(next_timestamp - timestamp) as duration
from (select t.*,
lag(t.value) over (partition by t.subjectid order by t.timestamp)
as prev_value,
lead(t.value) over (partition by t.subjectid order by
t.timestamp) as next_value,
lead(t.timestamp) over (partition by t.subjectid order by
t.timestamp) as next_timestamp
from t
) t
where value < 60 and next_value < 60 and
(prev_value is null or prev_value >= 60);
我希望得到这样的输出:
SubjectID DidEventOccur Duration
1 1 05:00:00
2 1 03:30:00
2 1 03:00:00
【问题讨论】:
-
如果连续超过 2 行的值 > 60 怎么办?忽略其余的? Postgres 版本?
-
是的,其余大于 60 的值可以忽略。我希望这可以澄清它。
-
您似乎认为该事件每个用户只能发生一次?会不会出现多次,然后返回什么?
-
好点!我只讨论一个事件,但如果它发生多次,我应该包括这个案例。谢谢!
标签: sql postgresql time-series window-functions gaps-and-islands