【问题标题】:Finding MODE instead of MAX/AVG with a group by function mysql通过函数 mysql 查找 MODE 而不是 MAX/AVG
【发布时间】:2018-11-30 08:56:01
【问题描述】:

我正在使用以下查询,但在测试时发现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 |
+-------+---------+-------------+

谁能帮帮忙....

【问题讨论】:

标签: mysql group-by average


【解决方案1】:

您可以通过首先获取每个信标/接收器对的 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

【讨论】:

【解决方案2】:

与许多其他复杂问题一样,动态规划可以很方便地解决这个问题,而且也很容易理解。

首先在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 |
+------+-----+-----------+----------+

【讨论】:

  • 有了这个,我现在可以轻松解决我的其他问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多