SQL大神带你飞 | 24春招京东SQL真题解析-每个顾客购买的最新产品名称
每个顾客购买的最新产品名称
https://www.nowcoder.com/practice/6ff37adae90f490aafa313033a2dcff7
最近做了京东的24年春招题,题目如下:
题目分析
在这道题目中,我们需要从多个表中提取信息以获取每个客户的最新订单。表结构如下:
-
orders(订单表)
order_id
:订单编号customer_id
:客户编号product_id
:产品编号order_date
:订单日期
-
products(产品表)
product_id
:产品编号product_name
:产品名称
-
customers(客户表)
customer_id
:客户编号customer_name
:客户姓名
目标:找出每个客户的最新订单产品名称。
输出要求:输出客户编号、客户姓名和最新订单的产品名称。
知识点关键词:窗口函数、表连接、排序
解答步骤
-
连接订单和产品表
首先,我们需要将订单表和产品表通过产品编号进行连接,以便获取每个订单的产品名称。
from orders o join products p on o.product_id = p.product_id
-
使用窗口函数获取最新订单
使用
row_number()
窗口函数为每个客户的订单按日期降序排列,并为每个客户的订单分配一个排名。partition by
用于按客户编号分组,order by
用于按订单日期降序排列。row_number() over(partition by o.customer_id order by o.order_date desc) as rk
-
筛选最新订单
在子查询中,我们只选择排名为1的订单,即每个客户的最新订单。
where rk = 1
-
连接客户表
将子查询结果与客户表通过客户编号进行连接,以获取客户姓名。
join customers c on c.customer_id = o.customer_id
解题代码
select o.customer_id, c.customer_name,
latest_order
from(
select
o.customer_id, p.product_name as latest_order,
row_number() over(partition by o.customer_id order by o.order_date desc) as rk
from orders o
join products p on o.product_id = p.product_id
)o
join customers c on c.customer_id = o.customer_id
where rk = 1
近似题目练习推荐
- 知识点:分组、窗口函数、子查询
- 知识点:分组、窗口函数、排序、连接查询
- 知识点:分组、窗口函数、子查询
- 知识点:分组、窗口函数、连接查询
- 知识点:分组、窗口函数、子查询、表连接