表: Friends
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
| activity | varchar |
+---------------+---------+
id 是朋友的 id,并且在 SQL 中,是该表的主键
name 是朋友的名字
activity 是朋友参加的活动的名字
表: Activities
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| name | varchar |
+---------------+---------+
在 SQL 中,id 是该表的主键
name 是活动的名字
找出那些既没有最多,也没有最少参与者的活动的名字。
Activities 表中的任意活动都有在 Friends 中参与过。
可以以 任何顺序 返回结果。
下面是返回结果格式的例子。
示例 1:
输入:
Friends 表:
+------+--------------+---------------+
| id | name | activity |
+------+--------------+---------------+
| 1 | Jonathan D. | Eating |
| 2 | Jade W. | Singing |
| 3 | Victor J. | Singing |
| 4 | Elvis Q. | Eating |
| 5 | Daniel A. | Eating |
| 6 | Bob B. | Horse Riding |
+------+--------------+---------------+
Activities 表:
+------+--------------+
| id | name |
+------+--------------+
| 1 | Eating |
| 2 | Singing |
| 3 | Horse Riding |
+------+--------------+
输出:
+--------------+
| activity |
+--------------+
| Singing |
+--------------+
解释:
Eating 活动有三个人参加, 是最多人参加的活动 (Jonathan D. , Elvis Q. and Daniel A.)
Horse Riding 活动有一个人参加, 是最少人参加的活动 (Bob B.)
Singing 活动有两个人参加 (Victor J. and Jade W.)
思路:
1、因为题目要求,求出非最多和最少的活动的名字,可以使用max,min先找出最大和最小值,然后取反;
2,、用窗口函数dense_rank()排序,正序和倒序分别找去排名第一的,然后求 rn != 1。
代码1:
sql
select activity
from (
select
activity,
count(name) cnt,
max(count(name)) over () max_cnt,
min(count(name)) over () min_cnt
from friends
group by activity
) t
where cnt not in (max_cnt, min_cnt);
代码2:
sql
select
activity
from
(
select
activity,
dense_rank() over(order by count(id) desc) rn1,
dense_rank() over(order by count(id)) rn2
from Friends
group by activity
)
where rn1 != 1 and rn2 != 1