【LeetCode-SQL】1355. 活动参与者

目录

  • 一、题目
  • 二、解决
    • 1、with+max+min
    • 2、HAVING COUNT(*) > SOME()
    • 3、dense_rank() over()
  • 三、参考

一、题目

表: Friends

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
| activity      | varchar |
+---------------+---------+
id 是朋友的 id 和该表的主键
name 是朋友的名字
activity 是朋友参加的活动的名字

表: Activities

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| name          | varchar |
+---------------+---------+
id 是该表的主键
name 是活动的名字

写一条 SQL 查询那些既没有最多,也没有最少参与者的活动的名字

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、with+max+min

思路: 略。
代码:

with t1  as (select activity, count(activity) as cnt from Friends group by activity
)select activity
from t1
where cnt not in (select max(cnt) from t1) and  cnt not in (select min(cnt) from t1)

2、HAVING COUNT(*) > SOME()

思路: 略。
代码:

SELECT activity 
FROM Friends 
GROUP BY activity
HAVING 
COUNT(*) > SOME(SELECT COUNT(*) FROM Friends GROUP BY activity) 
AND 
COUNT(*) < SOME(SELECT COUNT(*) FROM Friends GROUP BY activity)

3、dense_rank() over()

思路:

把每个活动参加的人数正排序一次,反排序一次,取两个rank里都不等于1的。

代码:


select activity
from
(select activity, dense_rank() over(order by count(id) desc) as rnk, dense_rank() over(order by count(id) asc) as reverse_rnkfrom Friends group by activity
) as t1
where rnk != 1 and reverse_rnk != 1;

三、参考

1、Lethe_


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部