繁体   English   中英

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

[英]Display count of column excluding min and max values

我想计算下表 (FRIENDS) 中出现的活动的唯一出现次数。 然后,我想打印其出现次数不是所有出现次数的最大值或最小值的活动。

***ID/Name/Activity***
1/James/Horse Riding
2/Eric/Eating
3/Sean/Eating
4/John/Horse Riding
5/Chris/Eating
6/Jessica/Paying

前任:

Horse Riding occur 140 times
Playing occurs 170 times
Eating occurs 120 times
Walking occurs 150 times
Running occurs 200 times

此处出现次数最多的是 Running,出现 200 次,出现次数最少的是 Eating,出现 120 次。

因此,我想显示

Horse Riding
Playing
Walking

没有特别的顺序。

这是我到目前为止的代码,但我一直收到语法错误。 当我没有收到语法错误时,我会收到“每个派生表都必须有自己的别名错误”。 我是 SQL 的新手,所以我很感激我能得到的任何建议。

SELECT ACTIVITY, count(ACTIVITY) as Occurences FROM FRIENDS,
(SELECT MAX(Occur) AS Ma,MIN(Occur) AS Mi FROM (SELECT ACTIVITY, count(ACTIVITY) as Occur
FROM FRIENDS GROUP by City)) as T 
GROUP BY City HAVING Occurences!=T.Ma AND Occurences!=T.Mi ORDER BY Occurences DESC

在 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM