mysql - 显示不包括最小值和最大值的列数
问题描述
我想计算下面的表(朋友)中发生了多少次唯一的活动。然后,我想打印它们的出现不是所有出现的最大值或最小值的活动。
***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)
推荐阅读
- python - 我在 python 中遇到字符串和 for 循环的问题
- gitlab - 如何传递凭据以在 Gitlab CI 脚本中提取子模块?
- c# - C# 数组中的数组
- python - 启动桌面邮件程序并使用 python 启动一个空白电子邮件
- angular - ng 命令不执行
Dockerfile 中的标记 - javascript - 如何使用循环检查用户输入密码的次数?
- javascript - 将 RXJS 用于进行 API 调用的搜索输入,但即使使用 debounceTime 也会重复发生订阅
- oracle - 用于 Oracle 变更数据捕获的开源工具 - GoldenGate 的替代品
- jquery - 将excel和pdf导出到不同的目录
- python - 使用 for 循环替换矩阵中的值,但只保留最后替换的值