订阅更新

每个顾客最近的三笔订单

SQL 实战 123 题 · 第 121 题 中等 约 2 分钟读完

LeetCode 1532 · 分组 Top N、多字段排序

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

面试怎么回答

ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) 取 <= 3,关联顾客名,最后按 name、customer_id、order_date DESC 排序。这是分组 Top N 的通用写法,n 改成参数即可。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

顾客表和订单表(每个顾客每天最多一笔订单)。找出每个顾客最近的三笔订单,不足三笔的全部返回。按顾客名升序、顾客 ID 升序、订单日期降序排列。

表结构

  • Customers:customer_id(主键)、name
  • Orders:order_id(主键)、order_date、customer_id、cost

思路

分组 Top N:按顾客分区、订单日期降序编号,取编号 ≤ 3 的订单。因为每天最多一笔订单,日期不会并列,ROW_NUMBER 和 RANK 结果相同。推广到最近 n 笔只需改数字。

参考解法

select name customer_name ,customer_id,order_id,order_date
from (
select  name ,o.customer_id,order_id,order_date ,rank()over(partition by o.customer_id order by order_date desc) rk
from Orders o left join Customers c
on o.customer_id=c.customer_id
)t1
where rk <=3
order by customer_name ,customer_id,order_date desc

易错点

  • 如果一天可能有多笔订单,要明确并列规则,并在排序键里加上订单号保证结果确定。
刷题进度保存在当前浏览器