使用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:这回答了你的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标注答案接受。看,这回答了你的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑标注答案接受。看看这个,我现在可以轻松解决我的其他问题了。谢谢有了这个,我现在可以轻松地解决我的其他问题。谢谢