MySQL: число максимальных вхождений определенного значения - PullRequest
0 голосов
/ 02 мая 2019

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

Company | Employee | Room | Temperature
---------------------------------------
A       | Mike     | 301  | 20
A       | Mike     | 301  | 30
A       | Mike     | 301  | 30
A       | Mike     | 402  | 40
A       | Lisa     | 402  | 10

Теперь в своем запросе я группирую Company + Employee в один результат, и я ищу подсчет максимального числа вхождений значения Room, в то же время агрегируя другие значения, такие как температура.

SELECT
    Company,
    Employee,
    ??? as Room,
    AVG(Temperature) as Temperature
FROM
    example_table
GROUP BY
    Company,
    Employee

В этом примере комната 301 появляется 3 раза для Майка, который должен вывести 3 в статистической функции. Поскольку данные находятся на заданном интервале, это, по сути, максимальная продолжительность пребывания в комнате для этого сотрудника. Я ищу такой результат

Company | Employee | Room | Temperature
---------------------------------------
A       | Mike     | 3    | 30
A       | Lisa     | 1    | 10

Я чувствую, что что-то упустил, но до сих пор я не нашел ничего, что сработало в запросе для меня. Я могу group_concant комнаты и решить это с 2 строками кода в php, но фактические данные - это гигабайты, которые я не хочу отправлять в сценарий. Производительность запроса к базе данных не имеет значения. MySQL 8 доступен.

edit: я изменил пример, чтобы убедиться, что COUNT(DISTINCT Room) случайно не дает правильного результата, потому что это не то, что я ищу.

1 Ответ

0 голосов
/ 02 мая 2019
SELECT Company, Employee
   , MAX(roomOccurrence) AS Room
   , AVG(roomTemp * roomOccurrence) AS Temperature
FROM ( SELECT Company, Employee, Room
          , COUNT(*) AS roomOccurrence, AVG(Temperature) AS roomTemp
       FROM example_table
       GROUP BY Company, Employee, Room
     ) AS subQ
GROUP BY Company, Employee
;

Обратите внимание, что внешняя средняя температура взвешивает среднюю температуру из внутреннего запроса.

В качестве альтернативы, вы можете СУММИТЬ временные значения в подзапросе ... и затем разделить СУММУ СУММЫпо сумме комнаты СЧЕТ;но это должно быть так или иначе.В лучшем случае я ожидал бы незначительных различий в производительности и не уверен, что в любом случае будет постоянно быстрее.

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