校招算法笔面试 | SQL笔试面试编程题-查询订单

题目

题目链接

最近做了京东的24年春招题,题目如下:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

题目分析

表结构
  1. orders 表

    • order_id:订单编号
    • customer_id:客户编号
    • order_date:订单日期
  2. customers 表

    • customer_id:客户编号
    • customer_name:客户名称
目标

orders 表中获取每个客户的最新订单信息,并显示订单编号、客户名称和订单日期。

输出要求

按客户名称升序排列输出结果。

知识点关键词
  • SQL 连接(JOIN)
  • 子查询
  • 分组(GROUP BY)
  • 排序(ORDER BY)

解答步骤

步骤1:连接表

首先,我们需要连接 orderscustomers 表,以便获取每个订单的客户名称。

select o.order_id, c.customer_name, o.order_date
from orders o
join customers c on o.customer_id = c.customer_id
步骤2:获取每个客户的最新订单

使用子查询来获取每个客户的最新订单编号。

where (o.customer_id, o.order_id) in (
    select customer_id, max(order_id)
    from orders
    group by customer_id
)
  • 解释:子查询按 customer_id 分组,并获取每组的最大 order_id,即最新订单。
步骤3:排序结果

按客户名称升序排列最终结果。

order by c.customer_name asc

解题完整代码

select o.order_id, c.customer_name, o.order_date
from orders o
join customers c on o.customer_id = c.customer_id
where (o.customer_id, o.order_id) in (
    select customer_id, max(order_id)
    from orders
    group by customer_id
)
order by c.customer_name asc

近似题目练习推荐

未下单用户登陆渠道统计

  • 知识点:分组、聚合函数、子查询

每个顾客购买的最新产品名称

  • 知识点:分组、排序、窗口函数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值