问题描述
我想计算一下下表(FRIENDS)中发生了多少次活动。然后,我要打印其出现不是所有出现的最大值或最小值的活动。
Animal
例如:
Model
这里发生的最大次数是“跑步”,发生了200次,而发生了最小的事件是“饮食”,出现了120次。
因此,我想展示
***ID/Name/Activity***
1/James/Horse Riding
2/Eric/Eating
3/Sean/Eating
4/John/Horse Riding
5/Chris/Eating
6/Jessica/Paying
无特定顺序。
这是我到目前为止拥有的代码,但是我一直收到语法错误。当我没有收到语法错误时,我会收到“每个派生表都必须具有自己的别名错误”。我是sql的新手,所以我很乐意得到任何建议。
Horse Riding occur 140 times
Playing occurs 170 times
Eating occurs 120 times
Walking occurs 150 times
Running occurs 200 times
解决方法
在MySQL 8.0中,您可以使用聚合和窗口函数来做到这一点:
select *
from (
select activity,count(*) cnt,rank() over(order by count(*)) rn_asc,rank() over(order by count(*) desc) rn_desc
from mytable
group by activity
) t
where rn_asc > 1 and rn_desc > 1
子查询对每个活动的发生进行计数,并对它们进行升序和降序排序。剩下要做的就是排除顶部和底部的记录。如果存在顶部关系(或底部),则查询将其逐出。
在早期版本中,一个选项是having
子句:
select activity,count(*) cnt
from mytable t
group by activty
having count(*) > (select count(*) from mytable group by activity order by count(*) limit 1)
and count(*) < (select count(*) from mytable group by activity order by count(*) desc limit 1)