В PostgreSQL я пытаюсь найти субъектов, которые имеют последовательность значений ниже 60, за которой следуют два последовательных значения выше 60, которые появляются позже. Меня также интересует промежуток времени между первым записанным значением ниже 60 и вторым значением выше 60. Это событие может происходить несколько раз для каждого субъекта.
Я изо всех сил пытаюсь выяснить, как искать неограниченное количество значений <60, за которыми следуют 2 значения> = 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