【阿里巴巴】使用 LATERAL JOIN 查询租户 Top2 功能模块及调用占比
JOIN 连接聚合函数GROUP BY窗口函数用户行为分析面试真题
题目描述
来源:阿里 SQL 面试真题
某企业级 SaaS 平台为不同行业的租户提供多个功能模块,例如数据分析、用户管理和文件存储。产品团队需要分析每个租户最依赖的核心功能模块,并计算这些模块的调用量在该租户总调用量中的占比,用于指导功能迭代优先级和个性化套餐推荐。
数据表
tenants 租户表
| 字段 | 类型 | 说明 |
|---|---|---|
| tenant_id | INT | 租户编号,主键 |
| tenant_name | VARCHAR(50) | 租户名称 |
| plan_type | VARCHAR(20) | 套餐类型:基础版 / 专业版 / 企业版 / 旗舰版 |
| industry | VARCHAR(30) | 所属行业 |
usage_logs 功能调用日志表
| 字段 | 类型 | 说明 |
|---|---|---|
| log_id | INT | 日志编号,主键 |
| tenant_id | INT | 租户编号,关联 tenants.tenant_id |
| module_name | VARCHAR(30) | 功能模块名称 |
| usage_date | DATE | 调用日期 |
| call_count | INT | 当日调用次数,保证 ≥ 1 |
问题
请使用 LATERAL JOIN 查询每个租户调用量最高的前 2 个功能模块,并计算每个模块的调用量占比。
具体规则:
- 先按 tenant_id × module_name 汇总模块总调用次数 total_calls。
- 对每个租户按 total_calls 降序取前 2 个模块。
- total_calls 相同时,按 module_name 升序决定排名。
- usage_pct = total_calls / 该租户所有模块总调用次数 × 100,四舍五入保留 2 位小数。
- 某租户模块不足 2 个时,输出该租户的全部模块;无调用记录的租户不输出。
输出字段
| 字段 | 说明 |
|---|---|
| tenant_name | 租户名称 |
| plan_type | 套餐类型 |
| module_name | 功能模块名称 |
| total_calls | 模块总调用次数 |
| usage_pct | 模块调用量占该租户所有模块总调用量的百分比 |
结果按 tenant_id 升序;同一租户内按 total_calls 降序,若相同则按 module_name 升序。
数据样例
| tenant_idPKINT | tenant_nameVARCHAR(50) | plan_typeVARCHAR(20) | industryVARCHAR(30) |
|---|---|---|---|
| 1 | 星海零售 | 专业版 | 零售 |
| 2 | 远航银行 | 企业版 | 金融 |
| 3 | 启明教育 | 基础版 | 教育 |
| 4 | 恒岳制造 | 旗舰版 | 制造 |
输入数据显示 4 / 4 行
SQL 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里