我如何编写此 Postgres 查询?
How do I write this Postgres Query?
对于我的数据,我有一个在 1 和 0 之间切换的值。我需要为值为 0 的段找到 "time deltas"。我认为这将使用 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;
这就是所谓的差距和孤岛问题。使用两个计数器,一个用于所有行,一个用于每个值,减去并得到每个值的组键:
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 演示:http://rextester.com/WIUX68902
对于我的数据,我有一个在 1 和 0 之间切换的值。我需要为值为 0 的段找到 "time deltas"。我认为这将使用 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;
这就是所谓的差距和孤岛问题。使用两个计数器,一个用于所有行,一个用于每个值,减去并得到每个值的组键:
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 演示:http://rextester.com/WIUX68902