订阅更新

订单最多的客户:并列第一也要考虑

SQL 实战 123 题 · 第 28 题 简单 约 2 分钟读完

LeetCode 586 · 分组计数、Top 1、并列处理

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

分组计数后按数量降序取第一。面试官常追问并列怎么办:我会在分组结果上用 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 在并列时只会随机返回其中一个。
刷题进度保存在当前浏览器