SQL大神带你飞 | 24春招京东SQL真题解析-每个顾客购买的最新产品名称

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

https://www.nowcoder.com/practice/6ff37adae90f490aafa313033a2dcff7

最近做了京东的24年春招题,题目如下: alt

题目分析

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

  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

近似题目练习推荐

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

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

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

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

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

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

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

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

更新员工信息表

  • 知识点:分组、窗口函数、子查询、表连接
全部评论

相关推荐

永远年轻_永远热泪盈眶:咱们真是苦难哥俩,我是浙大宁理,你是浙大城院,测试学历卡得不严,之前携程实习,只能说确实wlb,但携程学历厂,当时我mentor面试官,给我们看了他面试的六个人,全是研究生,学历最烂的一个都是杭电研究生,复旦华科一堆
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务