2014-07-10 3 views
0

У меня есть следующие таблицы «UserState»:Как найти следующую дату PostgreSQL

_id___|_ctime____________________________|_state__________|_userid 
1 | 2014-06-09 05:57:07.033334+00 | Ready   | 1 
2 | 2014-06-09 05:53:35.243864+00 | Busy   | 1 
3 | 2014-06-09 05:51:39.412722+00 | Ready   | 1 
4 | 2014-06-09 05:48:48.09651+00  | logged out  | 1 

* CTime означает время получения нового статуса пользователя. Эта таблица означает, что у меня есть только начальное время состояния, но не знаю до конца. Конечное время состояния - это время начала другого.

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

идента | состояние | ctime | конечное время с учетом конечного времени в качестве времени начала (ctime) следующего состояния

Невозможно добавить новые столбцы в таблицу «UserState». Но возможно, что пользователь с (id = 1) может иметь состояние «Готов» после того же состояния «Готов», такие состояния должны быть сгруппированы в 1 строку.

+0

Когда пользователь с идентификатором # 1 группируется, что 'ctime'? Первый или последний? Это происходит только с # 1? –

ответ

2

Функция окна будет делать это:

select userid, 
     state, 
     ctime as start_time, 
     lead(ctime) over (partition by userid order by ctime) as end_time 
from userstate; 

Если вы не привыкли к оконным функциям, смотрите инструкцию Postgres:
http://www.postgresql.org/docs/current/static/tutorial-window.html

+0

thx, это именно то, что мне нужно! – user3824666

+0

@ user3824666 это предполагает, что вы хотите следующую дату .. это не самая близкая дата, если ближайшая дата предшествует? –

0

Это точно, что может сделать window functions. В этом случае вы можете использовать функцию lead().

+0

Спасибо тоже. Для меня не всегда очевидно, как работают окна. – user3824666

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