1 题目描述
RequestAccepted 表:
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| requester_id | int |
| accepter_id | int |
| accept_date | date |
+----------------+---------+
(requester_id, accepter_id) 是这张表的主键 (具有唯一值的列的组合)
这张表包含发送好友请求的人的 ID, 接收好友请求的人的 ID, 以及好友请求通过的日期
编写解决方案, 找出拥有最多的好友的人和他拥有的好友数目
生成的测试用例保证拥有最多好友数目的只有 1 个人
2 测试用例
输入:
RequestAccepted 表:
+--------------+-------------+-------------+
| requester_id | accepter_id | accept_date |
+--------------+-------------+-------------+
| 1 | 2 | 2016/06/03 |
| 1 | 3 | 2016/06/08 |
| 2 | 3 | 2016/06/08 |
| 3 | 4 | 2016/06/09 |
+--------------+-------------+-------------+
输出:
+----+-----+
| id | num |
+----+-----+
| 3 | 3 |
+----+-----+
解释:
编号为 3 的人是编号为 1, 2 和 4 的人的好友, 所以他总共有 3 个好友, 比其他人都多
3 解题思路
- 使用
union all将requester_id, accepter_id聚合到同一个字段id
+--+
|id|
+--+
|2 |
|3 |
|4 |
|3 |
|4 |
|1 |
|1 |
|1 |
|2 |
|3 |
+--+
- 对聚合后的
id分组统计数量num
select id, count(*) as num
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra
group by id
查询结果
+--+---+
|id|num|
+--+---+
|2 |2 |
|3 |3 |
|4 |2 |
|1 |3 |
+--+---+
- 对
num倒序排序, 使用limit 0,1获取num最大的一条数据
select id, count(*) as num
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra
group by id
order by num desc
limit 1;
查询结果
+--+---+
|id|num|
+--+---+
|1 |3 |
+--+---+
4 进阶问题
在真实世界里, 可能会有多个人拥有好友数相同且最多, 你能找到所有这些人吗?
4.1 测试数据
+------------+-----------+-----------+
|requester_id|accepter_id|accept_date|
+------------+-----------+-----------+
|1 |2 |2016-06-03 |
|1 |3 |2016-06-08 |
|1 |4 |2016-06-09 |
|2 |3 |2016-06-08 |
|3 |4 |2016-06-09 |
+------------+-----------+-----------+
4.2 解题思路
- 使用
union all将requester_id, accepter_id聚合到同一个字段id, 对聚合后的id分组统计数量num, 使用dense_rank()对num进行倒序排名
select id, count(*) as num, dense_rank() over (order by count(*) desc) as rk
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra
group by id
查询结果
+--+---+--+
|id|num|rk|
+--+---+--+
|3 |3 |1 |
|1 |3 |1 |
|2 |2 |2 |
|4 |2 |2 |
+--+---+--+
- 查找排名为 1 的数据
rk = 1, 就是好友数最多的信息 (包含好友数相同的场景)
select id, num from (select id, count(*) as num, dense_rank() over (order by count(*) desc) as rk
from (select accepter_id as id from RequestAccepted union all select requester_id as id from RequestAccepted) as ra
group by id) as t
where rk = 1;
查询结果
+--+---+
|id|num|
+--+---+
|3 |3 |
|1 |3 |
+--+---+