Преобразование SQL-запроса в MySQL с интервалом разделения - PullRequest
0 голосов
/ 21 ноября 2018

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

Ниже приводится структура таблицы

---------------------------------------------------
USERs Activity Table
---------------------------------------------------

created_at              Event       User            Start_timestamp         End_Timestamp           Duration
-------------------     ---------   -------         -------------------     -------------------     --------
2018-11-20 18:01:22     LOGIN       john.doe        2018-11-20 18:01:22     2018-11-20 19:01:22     3600
2018-11-20 18:01:22     LOGIN       jane.miller     2018-11-20 18:10:03     2018-11-20 20:10:03     7200
2018-11-20 18:15:16     BREAK       john.doe        2018-11-20 18:15:16     2018-11-20 18:33:47     300
2018-11-20 18:33:47     ONCALL      john.doe        2018-11-20 18:33:47     2018-11-20 18:36:47     180

Мы хотим создать отчет, которыйможет дать нам 15-минутный интервал для всех пользователей, как показано ниже

---------------------------------------------------
Desired Result in 15 minutes time interval 
---------------------------------------------------

Intervals               User            LOGIN TIME      BREAK TIME      CALL TIME
-------------------     ----------      ----------      ----------      ---------
2018-11-20 18:00:00     john.doe        00:15:00        00:00:00        00:00:00
2018-11-20 18:00:00     jane.miller     00:04:57        00:00:00        00:00:00
2018-11-20 18:15:00     john.doe        00:15:00        00:00:00        00:00:00
2018-11-20 18:15:00     jane.miller     00:15:00        00:00:00        00:00:00
2018-11-20 18:30:00     john.doe        00:15:00        00:15:00        00:00:00
2018-11-20 18:30:00     jane.miller     00:15:00        00:00:00        00:00:00
2018-11-20 18:45:00     john.doe        00:15:00        00:03:15        00:03:00
2018-11-20 18:45:00     jane.miller     00:15:00        00:00:00        00:00:00
2018-11-20 19:00:00     john.doe        00:01:22        00:00:00        00:00:00
2018-11-20 19:00:00     jane.miller     00:15:00        00:00:00        00:00:00
2018-11-20 19:15:00     jane.miller     00:15:00        00:00:00        00:00:00
2018-11-20 19:30:00     jane.miller     00:15:00        00:00:00        00:00:00
2018-11-20 19:45:00     jane.miller     00:15:00        00:00:00        00:00:00
2018-11-20 20:00:00     jane.miller     00:10:03        00:00:00        00:00:00
-------------------                     ----------      ----------      ----------

Чего я не могу достичь, так это того, что у нас есть одна строка для каждого события, и если я получаю отчет на основе 15-минутного интервала, я получаюобщая длительность в зависимости от интервала, в котором началось событие, и неправильно отображать 30 минут времени с 15-минутным интервалом.Однако следует указать, например, 3 минуты в 1 интервале и 12 минут в другом;фактическое время, проведенное в каждом интервале.

Пожалуйста, сообщите, как этого можно достичь.Я также создал временную таблицу, которая заполняется 15-минутными интервалами, для которых я хочу, чтобы данные генерировались и использовались для объединений, но я не являюсь экспертом в SQL и нуждаюсь в помощи / совете от вас, ребята.

Ниже следуетзапрос, с которым я играл, но пока безуспешно.

    SELECT 
      DATE_FORMAT(SEC_TO_TIME(TIME_TO_SEC(a.created_at) - TIME_TO_SEC(a.created_at) % (15 * 60)),"%Y-%m-%d %H:%i") AS time_interval
      , a.user
      , SEC_TO_TIME(IFNULL(SUM(CASE WHEN a.event = 'LOGIN' THEN a.duration END),0)) AS login_time
      , SEC_TO_TIME(IFNULL(SUM(CASE WHEN a.event = 'BREAK' THEN a.duration END),0)) AS break_time
      , SEC_TO_TIME(IFNULL(SUM(CASE WHEN a.event = 'ONCALL' THEN a.duration END),0)) AS talk_time
    FROM users_activity AS a
    WHERE a.created_at > '2018-11-20 00:00:00' 
    GROUP BY time_interval, a.user
    ORDER BY time_interval DESC;

Скрипка SQL со схемой https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0d64482c499a07e9d1c7ec232915969e

Заранее спасибо.

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