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