【阿里巴巴】查询销售额排名前两名商品
WHERE 条件JOIN 连接聚合函数GROUP BY窗口函数ORDER BYDISTINCT营收统计排行榜面试真题
题目描述
来源:阿里巴巴 SQL 面试真题
某支付 App 会在客户端记录支付流程日志,其中支付方式不为空的日志属于支付数据。现在需要根据支付日志和商品价格,找出销售额排名前两名的商品。
数据表
user_client_log 客户端日志表
| 字段 | 类型 | 说明 |
|---|---|---|
| trace_id | VARCHAR | 订单号 |
| uid | BIGINT | 用户 ID |
| logtime | DATETIME | 客户端事件发生时间 |
| step | VARCHAR | 客户端步骤 |
| product_id | VARCHAR | 商品 ID |
| pay_method | VARCHAR | 支付方式,为 NULL 或空字符串时不属于支付数据 |
product_info 商品信息表
| 字段 | 类型 | 说明 |
|---|---|---|
| product_id | VARCHAR | 商品 ID,主键 |
| price | DECIMAL | 商品价格 |
| type | VARCHAR | 商品品类 |
| product_name | VARCHAR | 商品名称 |
销售额口径
pay_method非 NULL 且去除首尾空格后不为空的日志,视为支付数据。trace_id是订单号,同一订单可能产生多条客户端日志,同一trace_id + product_id只计 1 个支付订单。- 商品销售额 = 去重支付订单数 × 商品价格。
- 没有支付订单的商品不参与销售额排名。
题目要求
- 按商品销售额降序计算排名。
- 销售额相同的商品排名相同。
- 返回销售额排名前两个名次的全部商品名称。
- 最终按销售额降序排列;销售额相同时按商品名称升序排列。
期望输出列
| 列名 | 说明 |
|---|---|
| product_name | 销售额排名前两名的商品名称 |
数据样例
| trace_idVARCHAR(50) | uidBIGINT | logtimeDATETIME | stepVARCHAR(20) | product_idVARCHAR(32) | pay_methodVARCHAR(20) |
|---|---|---|---|---|---|
| R1001 | 101 | 2022-01-01 09:00:00 | order | p100 | wx |
| R1001 | 101 | 2022-01-01 09:00:10 | start | p100 | wx |
| R1001 | 101 | 2022-01-01 09:01:00 | end | p100 | wx |
| R1002 | 102 | 2022-01-01 09:10:00 | end | p100 | alipay |
| R1003 | 103 | 2022-01-01 09:20:00 | end | p100 | wx |
| R2001 | 104 | 2022-01-01 09:30:00 | end | p101 | wx |
| R2002 | 105 | 2022-01-01 09:40:00 | end | p101 | alipay |
| R3001 | 106 | 2022-01-01 09:50:00 | end | p102 | wx |
输入数据显示 8 / 14 行
SQL 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里