校招算法笔面试 | SQL笔试面试编程题-每个顾客购买的最新产品名称

题目

题目链接

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

题目分析

在这道题目中,我们需要从多个表中提取信息以获取每个客户的最新订单。表结构如下:

  1. orders(订单表)

    • order_id:订单编号
    • customer_id:客户编号
    • product_id:产品编号
    • order_date:订单日期
  2. products(产品表)

    • product_id:产品编号
    • product_name:产品名称
  3. customers(客户表)

    • customer_id:客户编号
    • customer_name:客户姓名

目标:找出每个客户的最新订单产品名称。

输出要求:输出客户编号、客户姓名和最新订单的产品名称。

知识点关键词:窗口函数、表连接、排序

解答步骤

  1. 连接订单和产品表

    首先,我们需要将订单表和产品表通过产品编号进行连接,以便获取每个订单的产品名称。

    from orders o
    join products p on o.product_id = p.product_id
    
  2. 使用窗口函数获取最新订单

    使用 row_number() 窗口函数为每个客户的订单按日期降序排列,并为每个客户的订单分配一个排名。partition by 用于按客户编号分组,order by 用于按订单日期降序排列。

    row_number() over(partition by o.customer_id order by o.order_date desc) as rk
    
  3. 筛选最新订单

    在子查询中,我们只选择排名为1的订单,即每个客户的最新订单。

    where rk = 1
    
  4. 连接客户表

    将子查询结果与客户表通过客户编号进行连接,以获取客户姓名。

    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

近似题目练习推荐

牛客每个人最近的登录日期(一)

  • 知识点:分组、窗口函数、子查询

牛客每个人最近的登录日期(二)

  • 知识点:分组、窗口函数、排序、连接查询

牛客每个人最近的登录日期(三)

  • 知识点:分组、窗口函数、子查询

获取有奖金的员工相关信息

  • 知识点:分组、窗口函数、连接查询

更新员工信息表

  • 知识点:分组、窗口函数、子查询、表连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值