Как суммировать последовательные строки в таблице MySQL - PullRequest
0 голосов
/ 30 мая 2018

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

user_id  location  time                
-------  --------  -------------------   
1        room1     2018-05-18 03:20:00     
1        room1     2018-05-18 03:21:15
1        room2     2018-05-18 03:22:07
2        room1     2018-05-18 03:24:20     
2        room1     2018-05-18 03:27:55
2        room1     2018-05-18 03:29:09      
1        room2     2018-05-18 03:32:37    
1        room1     2018-05-18 03:34:41
1        room1     2018-05-18 03:39:28

Я пытаюсь обобщить информацию о том, как долго каждый пользователь находился в каждой комнате, например:

user_id  location  duration(s)
-------  --------  -----------
1        room1     75
2        room1     289
1        room2     630
1        room1     287

Есть ли способ сделать это с помощью одного запроса?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Если вы используете MySQL 8.0 , вы легко можете решить эту проблему с помощью оконных функций:

;WITH GroupedTable AS (
   SELECT user_id, location, time,
          ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY time) - 
          ROW_NUMBER() OVER (PARTITION BY user_id, location ORDER BY time) AS grp
   FROM mytable
)
SELECT user_id, location, TIMESTAMPDIFF(SECOND, MIN(time), MAX(time)) AS duration
FROM GroupedTable  
GROUP BY user_id, location, grp
0 голосов
/ 30 мая 2018

Вы можете справиться с этим, используя переменные или коррелированный подзапрос.Переменные обычно более эффективны:

select user_id, location, min(time), max(time),
       timestampdiff(second, min(time), max(time)) as duration
from (select t.*,
             (@grp := if(@ul = concat_ws(':', user_id, location), @grp,
                         if(@ul := concat_ws(':', user_id, location), @grp + 1, @grp + 1)
                        )
             ) as grp
      from (select t.*
            from t
            order by user_id, time
           ) t cross join
           (select @ul := '', @grp := 0) params
     ) t
group by user_id, location, grp;

Здесь - это скрипта SQL с рабочим кодом.

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