Поиск MODE вместо MAX / AVG с группой по функции mysql - PullRequest
0 голосов
/ 30 ноября 2018

Я использовал следующий запрос, но пока тестирование показало, что MODE дает мне лучший результат, чем рассмотрение MAX.

SELECT MAX(rssi) AS rssii,beacon,receiver  
FROM readings 
WHERE created_datetime BETWEEN  '2018-11-29 09:46:10'  AND  '2018-11-29 10:58:50'
GROUP BY beacon,receiver;

Мне удалось получить режим RSSI, пока* выбирая только конкретный столбец, который я имею в виду, без какой-либо группы,

SELECT rssi,count(*) as occurs
FROM readings
GROUP BY `rssi` order by occurs desc
LIMIT 1;

, но мне трудно сделать то же самое для каждой группы,

ожидаемый формат результата

+-------+-----------+-----------+
| rssii | beacon    |   receiver|
+-------+-----------+-----------+
|   -42 |       AAA |       XXX |
|   -49 |       AAA |       YYY |
|   -49 |       AAA |       ZZZ |
|   -44 |       BBB |       XXX |
|   -54 |       BBB |       YYY |
|   -52 |       BBB |       ZZZ |
|   -49 |       CCC |       XXX |
|   -42 |       CCC |       YYY |
|   -57 |       CCC |       ZZZ |
+-------+---------+-------------+

Может кто-нибудь, пожалуйста, помогите ....

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Как и во многих других сложных задачах, динамическое программирование удобно для решения этой проблемы и также легко для понимания.

Сначала объявите две временные переменные в Mysql

set @mc1 = '', @rc1 = '';

Затем используйте этив качестве временного заполнителя и для перебора набора результатов.

select rssi,cr, mc,rc, @mc1:=mc,@rc1:=rc from (
SELECT rssi, count(rssi) cr,beacon AS mc,receiver AS rc
FROM readings
WHERE created_datetime BETWEEN  '2018-11-29 09:46:10'  AND  '2018-11-29 10:58:50'
GROUP BY readings.beacon ,readings.receiver, rssi order by mc,rc,cr desc
) p where (mc != @mc1 or rc != @rc1)

и я получаю то, что хотел

+------+-----+-----+-----+----------+----------+
| rssi | cr  | mc  | rc  | @mc1:=mc | @rc1:=rc |
+------+-----+-----+-----+----------+----------+
|  -53 | 127 | AAA | XXX    | AAA   | XXX |
|  -55 | 109 | AAA | YYYY   | AAA   | YYYY |
|  -52 | 194 | AAA | ZZZ    | AAA   | ZZZ |
|  -53 | 112 | BBB | XXX    | BBB   | XXX |
|  -48 | 218 | BBB | YYYY   | BBB   | YYYY |
|  -64 |  72 | BBB | ZZZ    | BBB   | ZZZ |
|  -47 | 151 | CCC| XXX     | CCC   | XXX |
|  -38 | 204 | CCC| YYYY    | CCC   | YYYY |
|  -53 | 120 | CCC| ZZZ     | CCC   | ZZZ |
|  -54 | 152 | DDD| XXX     | DDD   | XXX |
|  -62 |  80 | DDD| YYYY    | DDD   | YYYY |
|  -56 | 138 | DDD| ZZZ     | DDD   | ZZZ |
+------+-----+-----------+----------+
0 голосов
/ 30 ноября 2018

Вы можете решить свою проблему, сначала получив количество rssi значений для пары маяк / приемник, например:

SELECT beacon, receiver, rssi, COUNT(*) as occurs
FROM readings
GROUP BY beacon, receiver, rssi

Затем, чтобы найти режим для каждой пары маяк / приемник, вы можете использовать этов качестве подзапроса, присоединяя его к списку максимальных occurs значений:

SELECT beacon, receiver, rssi, occurs 
FROM (SELECT beacon, receiver, rssi, COUNT(*) as occurs
      FROM readings
      GROUP BY beacon, receiver, rssi) r1
JOIN (SELECT beacon, receiver, rssi, MAX(occurs)
      FROM (SELECT beacon, receiver, rssi, COUNT(*) as occurs
            FROM readings
            GROUP BY beacon, receiver, rssi) r2
      GROUP BY beacon, receiver, rssi) r3
  ON r3.beacon = r1.beacon AND r3.receiver = r1.receiver AND r3.rssi = r1.rssi

Обратите внимание, что при наличии нескольких значений режима для пары маяк / приемник вы получите все из них.Вы можете использовать MAX(rssi) в начальном выборе и GROUP BY beacon, receiver, чтобы ограничить результат одним значением rssi на пару, то есть

SELECT beacon, receiver, MAX(rssi), occurs 
FROM (SELECT beacon, receiver, rssi, COUNT(*) as occurs
      FROM readings
      GROUP BY beacon, receiver, rssi) r1
JOIN (SELECT beacon, receiver, rssi, MAX(occurs)
      FROM (SELECT beacon, receiver, rssi, COUNT(*) as occurs
            FROM readings
            GROUP BY beacon, receiver, rssi) r2
      GROUP BY beacon, receiver, rssi) r3
  ON r3.beacon = r1.beacon AND r3.receiver = r1.receiver AND r3.rssi = r1.rssi
GROUP BY beacon, receiver
...