使用group by函数mysql查找模式而不是MAX/AVG

使用group by函数mysql查找模式而不是MAX/AVG,mysql,group-by,average,Mysql,Group By,Average,我使用了下面的查询,但在测试时发现模式比考虑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

我使用了下面的查询,但在测试时发现
模式
比考虑
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 |
+-------+---------+-------------+

任何人都可以帮助……

您可以先获得每个信标/接收器对的
rssi
值的计数,如下所示来解决您的问题:

SELECT beacon, receiver, rssi, COUNT(*) as occurs
FROM readings
GROUP BY beacon, receiver, rssi
然后,要查找每个信标/接收器对的模式,您可以将其用作子查询,将其连接到最大
发生值的列表中
值:

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

您可以通过以下方式首先获得每个信标/接收机对的
rssi
值的计数来解决问题:

SELECT beacon, receiver, rssi, COUNT(*) as occurs
FROM readings
GROUP BY beacon, receiver, rssi
然后,要查找每个信标/接收器对的模式,您可以将其用作子查询,将其连接到最大
发生值的列表中
值:

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

就像在许多其他复杂问题中一样,动态规划可以方便地解决这个问题,也很容易理解

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

就像在许多其他复杂问题中一样,动态规划可以方便地解决这个问题,也很容易理解

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

您预期的输出是什么?可能与您使用的MySQL版本重复?在MySQL 8.0.2和above@Madhurmysql 5.7。Madhur u共享的链接更简单,我的意思是我的问题有点不同,cse我必须找到每组信标的模式,Receiver请看:您的预期输出是什么?可能与您使用的MySQL版本重复?在MySQL 8.0.2和above@Madhurmysql 5.7。Madhur你分享的链接更简单,我的意思是我的问题有点不同,因为我必须找到每组信标的模式,receiverSee:这回答了你的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标注答案接受。看,这回答了你的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标注答案接受。看看这个,我现在可以轻松解决我的其他问题了。谢谢有了这个,我现在可以轻松地解决我的其他问题。谢谢