表: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:
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:
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