PostgreSQL вычисляет разницу во времени в альтернативных строках - PullRequest
0 голосов
/ 12 октября 2018

У меня есть таблица Postgres со следующими данными

#Id Time            Setting
10x,    9/11/2018 12:01,     1
10x,    9/11/2018 12:04,     0
11x,    9/7/2018 14:47,  1
11x,    9/7/2018 14:48,  0
11x,    9/7/2018 14:49,  1
11x,    9/7/2018 14:50,  0

Данные уже отсортированы в порядке возрастания по Id, Time.Моя цель состоит в том, чтобы вычислить разницу во времени между последовательными строками, где «настройка» изменилась с 1 до 0 для данного идентификатора.Я могу с уверенностью предположить, что есть четное количество строк, и за каждой строкой с «Настройкой» 1 следует строка с настройкой «0»

Ожидаемый результат

# Id, Duration 
10x,  3min
11x,  1min  
11x,  1min 

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете попробовать использовать функцию lag(), как в следующем случае:

select t2.Id, 
       cast((60*cast(to_char(t2.l_time,'hh24') as int)+
                cast(to_char(t2.l_time,'mi')   as int)) as varchar)||' min'
       as Duration 
  from
(
select t1.*, 
        lag(setting) over (order by id,time) l_setting,
        time - lag(time) over (order by id,time) l_time 
  from tab t1
) t2 
where t2.setting = 0 and l_setting = 1;

id  duration
--- --------
10x  3 min
11x  1 min
11x  1 min

, где time предполагается в качестве столбца типа метки времени.

Rextester Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...