订单最多的客户:并列第一也要考虑
LeetCode 586 · 分组计数、Top 1、并列处理
面试怎么回答
分组计数后按数量降序取第一。面试官常追问并列怎么办:我会在分组结果上用 RANK() OVER (ORDER BY COUNT(*) DESC) 取 rk = 1,并列第一都会返回,比 LIMIT 更符合业务上的「最多」。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
订单表里找出订单数最多的客户编号。题目保证只有一位;进一步思考:如果有多位并列最多,怎么全部找出来?
表结构
- orders:order_number(主键)、customer_number、order_date、required_date、shipped_date、status、comment
思路
按客户分组计数、降序取第一。题目保证唯一时 LIMIT 1 就够了。要考虑并列时,不能用 LIMIT,而是对计数结果用 RANK 排名后取第一,或者用 HAVING 比较「计数等于最大计数」。
参考解法
select customer_number
from orders
group by customer_number
order by count(*) desc
limit 1
另一种写法:并列最多的客户全部返回
SELECT customer_number
FROM (
SELECT customer_number, RANK() OVER (ORDER BY COUNT(*) DESC) AS rk
FROM orders
GROUP BY customer_number
) t
WHERE rk = 1
易错点
- LIMIT 1 在并列时只会随机返回其中一个。