Как мне написать этот Postgres Query? - PullRequest
0 голосов
/ 21 сентября 2018

Для моих данных у меня есть значение, которое переключается между 1 и 0. Мне нужно найти «дельты времени» для сегментов, которые имеют значение 0. Я думаю, что это будет использовать функции min (), max ().Возможно звание.

Ввод:

Time_stamp            , value
'2018-01-01 10:15:00' , 1
'2018-01-01 10:16:00' , 1
'2018-01-01 10:17:00' , 0
'2018-01-04 10:18:00' , 0
'2018-01-04 10:19:00' , 1
'2018-01-04 10:20:00' , 1
'2018-01-06 10:21:00' , 1
'2018-01-06 10:22:00' , 0
'2018-01-06 10:23:00' , 0
'2018-01-07 10:24:00' , 1
'2018-01-07 10:25:00' , 1
'2018-01-07 10:26:00' , 1


Output
id | max                  |  min  
1  |'2018-01-04 10:18 AM' |'2018-01-01 10:17 AM'
2  |'2018-01-06 10:23 AM' |'2018-01-06 10:22 AM'

Вот SQL для создания данных

CREATE TABLE test_ts (
    time_stamp     TIMESTAMPTZ,
    val    integer
);
insert into test_ts
SELECT * FROM (
 VALUES
  ( '2018-01-01 10:15:00'::timestamptz , 1),
   ( '2018-01-01 10:16:00'::timestamptz  , 1),
   ( '2018-01-01 10:17:00'::timestamptz  , 0),
   ( '2018-01-04 10:18:00'::timestamptz  , 0),
   ( '2018-01-04 10:19:00'::timestamptz  , 1),
   ( '2018-01-04 10:20:00'::timestamptz  , 1),
   ( '2018-01-06 10:21:00'::timestamptz  , 1),
   ( '2018-01-06 10:22:00'::timestamptz  , 0),
   ( '2018-01-06 10:23:00'::timestamptz  , 0),
   ( '2018-01-07 10:24:00'::timestamptz  , 1),
   ( '2018-01-07 10:25:00'::timestamptz  , 1),
   ( '2018-01-07 10:26:00'::timestamptz  , 1)) testAlias;

1 Ответ

0 голосов
/ 21 сентября 2018

Это так называемая проблема разрывов и островков.Используйте два счетчика, один для всех строк, один для каждого значения, вычитайте, и вы получите групповые ключи для каждого значения:

select max(time_stamp), min(time_stamp)
from
(
  select 
    time_stamp,
    val,
    row_number() over (order by time_stamp) -
    row_number() over (partition by val order by time_stamp) as grp
  from test_ts
) groups
where val = 0
group by grp
order by min(time_stamp);

Rextester demo: http://rextester.com/WIUX68902

...