【阿里巴巴】查询各品类价格前两名商品
WHERE 条件子查询窗口函数ORDER BY排行榜面试真题
题目描述
来源:阿里巴巴 SQL 面试真题
某支付 App 维护了一张已去重的商品信息表。现在需要找出每种商品类型中价格排名前两名的商品。
数据表
product_info 商品信息表
| 字段 | 类型 | 说明 |
|---|---|---|
| product_id | VARCHAR | 商品 ID,主键 |
| price | DECIMAL | 商品价格 |
| type | VARCHAR | 商品品类 |
| product_name | VARCHAR | 商品名称 |
排名口径
- 在每个商品品类内,按商品价格降序计算排名。
- 价格相同的商品排名相同。
- 保留品类内价格排名为第 1 名或第 2 名的全部商品。
- 因为允许并列,同一品类可能返回超过两件商品。
- 某品类不足两个价格名次时,返回该品类的全部商品。
题目要求
- 输出商品 ID、商品名称、商品品类和商品价格。
- 最终按商品价格降序排列。
- 商品价格相同时,按商品名称升序排列。
- 如前两项仍相同,按商品 ID 升序稳定排列。
期望输出列
| 列名 | 说明 |
|---|---|
| product_id | 商品 ID |
| product_name | 商品名称 |
| type | 商品品类 |
| price | 商品价格 |
数据样例
| product_idPKVARCHAR(32) | priceDECIMAL(10, 2) | typeVARCHAR(50) | product_nameVARCHAR(100) |
|---|---|---|---|
| p100 | 100 | shoes | anta |
| p101 | 200 | shoes | li-ning |
| p102 | 50 | shoes | erke |
| p103 | 500 | shoes | nike |
| p599 | 5000 | telephone | huawei |
| p600 | 6000 | telephone | iphone13 |
| p601 | 2000 | telephone | vivo |
| p602 | 1500 | telephone | oppo |
输入数据显示 8 / 12 行
SQL 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里