2015-04-10 4 views
4

Я хочу рассчитать разницу между временем начала использования и временем остановки от предыдущего сеанса.Функция задержки/свинца MySQL?

Таблица содержит: числовое число пользователей, числовое значение start/stop unix. Он сортируется после как пользователь и начать

user start stop 
1 150000 150010 
1 160011 160050 
1 160100 160200 
2 150011 150023 
2 155001 155055 
2 160001 160500 
3 159001 159550 

Im ожидая результата выглядеть следующим образом:

user start stop diff 
1 150000 150010 160011-150010=10001 
1 160011 160050 160100-160050 
1 160100 160200 0 (new user on next row) 
2 150011 150023 155001-150023 
2 155001 155055 160001-155055 
2 160001 160500 0 (new user on next row) 
3 159001 159550 and so on.. 

Можно ли это сделать, если да, то каким образом?

+0

опубликовать свою работу. – akshay

+0

Я бы поспорил довольно большое количество пива, что бизнес-логика здесь испорчена. Почему у пользователя не было разницы во времени только потому, что в следующей строке есть другой пользователь? Кроме того, можем ли мы быть уверены, что таблица упорядочена по идентификатору пользователя и по дате начала? – ytg

+0

Я не смог создать ничего полезного. Забыл писать, но да таблица сортируется после пользователя И начинается! Я ищу только разницу пользователей, а не разницу между пользователями! Åke –

ответ

7

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

select `user`, `start`, `stop`, diff from (
    select 
    t.* 
    , if(@prev_user = `user`, (`stop` - @prev) * -1, 0) as diff 
    , @prev := `start` 
    , @prev_user := `user` 
    from 
    t 
    , (select @prev := null, @prev_user := null) var_init 
    order by `user`, `start` desc 
) sq 
order by `user`, `start` 
  • увидеть его работы вживую в sqlfiddle

Примечание, что не работают в MySQL. Все, что вы можете сделать, это использовать переменные. Предложение SELECT обрабатывается по одной строке за раз. Таким образом, вы можете назначить значение текущей строки в последних строках предложения SELECT и, следовательно, использовать эту переменную в качестве значения «предыдущей строки» в первых строках предложения SELECT.
Также обратите внимание, что ORDER BY очень важен. Таблица не сортируется. Данные в реляционной СУБД не сортируются, если вы не укажете порядок с предложением ORDER BY.

  • подробнее об использовании переменных в запросах here

EDIT:

Изменить его

UPDATE inactivitytmp 
JOIN (
SELECT 
inactivitytmp.* 
, if(@prev_user_id = `user_id`, (`end_ts` - @prev) * -1, 0) as diff2 
, @prev := `start_ts` 
, @prev_user_id := `user_id` 
FROM 
inactivitytmp 
, (SELECT @prev := null, @prev_user_id := null) var_init 
ORDER BY `user_id`, `start_ts` DESC 
) query_alias 
ON inactivitytmp.user_id=query_alias.user_id AND inactivitytmp.start_ts=q uery_alias.start_ts AND inactivitytmp.end_ts=query_alias.end_ts 
SET inactivitytmp.diff=query_alias.diff2;