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

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;