SQL大神带你飞 | 24春招京东SQL真题解析-每个顾客最近一次下单的订单信息
每个顾客最近一次下单的订单信息
https://www.nowcoder.com/practice/4762ea22b0eb42ceb4f0a972c56d24c4
最近做了京东的24年春招题,题目如下:
题目分析
表结构:
-
orders
表:包含以下字段:order_id
:订单ID,主键。customer_id
:顾客ID。order_date
:订单日期。
-
customers
表:包含以下字段:customer_id
:顾客ID,主键。customer_name
:顾客姓名。
目标:
- 查找每个顾客最后一次下单的订单信息,包括订单编号、顾客名称、以及最近下单日期。
输出要求:
- 返回每个顾客的最后一次订单信息。
知识点关键词
- 窗口函数:
ROW_NUMBER()
- 分组:
PARTITION BY
- 排序:
ORDER BY
- 连接操作:
JOIN
解答步骤
1. 使用窗口函数标记每个顾客的订单
我们使用 ROW_NUMBER()
窗口函数为每个顾客的订单按日期降序编号。通过 PARTITION BY
子句按 customer_id
分组,并按 order_date
降序排列。
select order_id, order_date, customer_id,
row_number() over(partition by customer_id order by order_date desc) as rk
from orders
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date DESC) AS rk
:为每个顾客的订单按日期降序编号。
2. 筛选出每个顾客的最后一次订单
我们通过 WHERE
子句筛选出 rk = 1
的记录,即每个顾客的最后一次订单。
where o.rk = 1
WHERE o.rk = 1
:筛选出每个顾客的最后一次订单。
3. 连接顾客信息
我们使用 JOIN
连接 customers
表,以获取顾客姓名。
join customers c on c.customer_id = o.customer_id
JOIN customers c ON c.customer_id = o.customer_id
:连接顾客信息。
完整代码
select o.order_id, c.customer_name, o.order_date
from (
select order_id, order_date, customer_id,
row_number() over(partition by customer_id order by order_date desc) as rk
from orders
) o
join customers c on c.customer_id = o.customer_id
where o.rk = 1;
近似题目推荐
以下是修正后的近似题目推荐:
-
- 知识点:窗口函数、分组、排序
-
- 知识点:窗口函数、分组、排序
-
给出employees表中排名为奇数行的first_name
- 知识点:聚合函数、分组、排序
-
- 知识点:字符串处理、分组统计、排序
这些题目都涉及到使用排序窗口函数(可以点击链接查看知识点)和分组操作来处理和分析数据,除却本题的row_number()函数,还可以练习rank()函数和dense_rank()函数的不同用法。