题解 | #商品价格排名#

商品价格排名

https://www.nowcoder.com/practice/119f5b8cfe5b45779a3e1b3f4d83b341

这道题目要求我们从商品信息中找出不同商品类型下价格排名前两名的商品,并从中选出价格最高的三个商品。我们要做的事情如下:

1. 确定总体问题

我们需要对每种商品类型进行分组,找出价格排名前两名的商品,按价格降序排列(如果价格相同则按商品名称排序),然后从这些商品中选出价格最高的三个商品。

2. 分析关键问题

  • 分组排名:对每种商品类型进行分组,并对价格进行降序排名。
  • 筛选前两名:筛选出每种商品类型中价格排名前两名的商品。
  • 排序和限制:从筛选出的商品中选出价格最高的三个商品。

3. 解决每个关键问题的代码及讲解

步骤1:分组排名

我们使用ROW_NUMBER窗口函数对每种商品类型进行分组,并对价格进行降序排名:

select
    price,
    row_number() over(partition by type order by price desc) as rk
from
    product_info
group by
    type, price
  • ROW_NUMBER() OVER (PARTITION BY type ORDER BY price DESC) AS rk:对每种商品类型(type)进行分组,并对价格进行降序排名。
步骤2:筛选前两名

我们在子查询中筛选出每种商品类型中价格排名前两名的商品:

where
    sub.rk <= 2
  • WHERE sub.rk <= 2:筛选出每种商品类型中价格排名前两名的商品。
步骤3:排序和限制

我们从筛选出的商品中选出价格最高的三个商品,并按价格降序排列(如果价格相同则按商品名称排序):

order by
    p.price desc, p.product_name
limit 3
  • ORDER BY p.price DESC, p.product_name:按价格降序排列,如果价格相同则按商品名称排序。
  • LIMIT 3:选出价格最高的三个商品。

完整代码

select
    p.product_id,
    p.product_name,
    p.type,
    p.price
from(
    select
        price,
        row_number() over(partition by type order by price desc) as rk
    from
        product_info
    group by
        type, price
) sub
join product_info p on p.price = sub.price 
where
    sub.rk <= 2
order by
    p.price desc, p.product_name
limit 3;
全部评论
在题目正确的前提先,官方题解出错 首先看题目:小明需要找出不同商品类型下商品价格排名前2的3个商品,最终以商品的价格逆序返回(价格相同则以商品名称排序) 再看官方解答 select p.product_id, p.product_name, p.type, p.price, rk from( select price, row_number() over(partition by type order by price desc) as rk from product_info group by type, price ) sub join product_info p on p.price = sub.price where sub.rk <= 2 order by p.price desc, p.product_name limit 3; 错误的点在使用price作为join条件,导致测试案例的两个5500的telephone被合成一个rk,都是rk=2 修改版: select product_id, product_name, type, price from ( select product_id, row_number() over (partition by type order by price desc) as rk from product_info ) as t1 join product_info as t2 using(product_id) where rk <= 2 order by price desc, product_id limit 3
点赞 回复 分享
发布于 05-04 16:38 广东

相关推荐

07-01 13:37
门头沟学院 Java
steelhead:不是你的问题,这是社会的问题。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务