Суммирование и разбиение таблицы в другую таблицу в MySQL - PullRequest
0 голосов
/ 03 июня 2018

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

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

В таблице выше показано, как долго пользователь находился в комнате, а количество строк показывает, сколько раз пользователь был в комнате.конкретная комната.Так, например, в приведенных выше данных есть 2 строки, в которых пользователь 1 находился в комнате room1, что означает, что он был в комнате1 дважды.Как бы я взял эти данные, превратив их в приведенную ниже таблицу:

user_id  room_1_freq  room_1_duration  room_2_freq  room_2_duration
-------  -----------  ---------------  -----------  ---------------
1        2            181              1            630
2        1            289              0            0

, в которой room_1_freq и room_2_freq - это количество раз, которое пользователь провел в соответствующих комнатах, а room_1_duration и room_2_duration - это среднее время, которое пользователь проводит в каждой комнате.Можно ли это сделать одним запросом?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Существует более простой (и, возможно, более гибкий) способ ответить на ваш вопрос.Ваша вторичная таблица (результаты) будет экспоненциально расширяться в зависимости от количества столбцов для каждой комнаты и каждого пользователя, о котором вам нужно будет сообщать, и, на мой взгляд, будет трудно управлять.Кроме того, используя решение Гордона, вам придется переписывать ваш запрос каждый раз при добавлении пользователя или комнаты.

Было бы намного легче поддерживать, если бы вы суммировали данные с использованием стандартных функций суммирования, подсчета и среднего в SQLсо стандартными пунктами группировки:

SELECT user_id, location, count(location), sum(duration), avg(duration) 
FROM visits
group by user_id, location

Это даст вам желаемые результаты, но в несколько ином формате:

Sum, count and average function use in SQL

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

0 голосов
/ 03 июня 2018

Если я правильно понимаю, это просто условная агрегация:

select user_id,
       sum(location = 'room1') as room1_freq,
       sum(case when location = 'room1' then duration else 0 end) as room1_dur,
       sum(location = 'room2') as room2_freq,
       sum(case when location = 'room2' then duration else 0 end) as room1_dur
from t
group by user_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...