显示列数,不包括最小值和最大值

问题描述

我想计算一下下表(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)