2016-04-04 3 views
0

У меня есть следующие проблемы, У меня есть таблица вроде этого:Group парами значений одного и того же столбца в SQL с таймсериях

[login] [time] [action] 
bou  3:15:21 display 
bou  3:16:45 connect 
bou  3:17:12 disconnect 
bou  3:17:15 connect 
bou  3:19:12 disconnect 
bou  3:21:15 connect 

То, что я хочу сделать, это просто получить число раз появляются каждая последующая пара действий, выполненных за один и тот же час. Таким образом, результат должен быть примерно

[login] [time] [action_1] [action_2] [count] 
bou  3  display connect 1 
bou  3  disconnect connect 2 

Большое спасибо.

ответ

2

Используйте lead() и некоторые даты арифметика:

select login, date_trunc('hour', time), action, next_action, count(*) 
from (select t.*, 
      lead(action) over (partition by login, date_trunc('hour', time) 
           order by time 
           ) as next_action 
     from t 
    ) t 
group by login, date_trunc('hour', time), action, next_action; 

Это становится все пары. Если вам нужны только пары, начинающиеся с чего-то другого, кроме connect, то добавьте where action <> 'connecdt' во внешний запрос.

+0

Отличный ответ. Разве это не показало бы пары «connect -> disconnect», хотя? Я не привык к поведению ведущей функции, поэтому просто прошу знаний :) –

+0

@ AnthonyDrogon. , , Хорошая точка зрения. Пример данных показывает, что происходит какая-то фильтрация, хотя вопрос задает пары в целом. –

Смежные вопросы