一、【背景】
某企业级SaaS平台为不同行业的租户提供多个功能模块(如数据分析、用户管理、文件存储等)。产品团队需要分析每个租户最依赖的核心功能模块,并计算该模块的调用量在该租户总调用量中的占比,用于指导功能迭代优先级和个性化套餐推荐。
【表结构与字段说明】
表1:tenants(租户表)
- tenant_id:INT,租户编号,主键
- tenant_name:VARCHAR(50),租户名称
- plan_type:VARCHAR(20),套餐类型(基础版/专业版/企业版/旗舰版)
- industry:VARCHAR(30),所属行业
表2: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 个功能模块及其在该租户总调用量中的占比。具体规则:先按模块汇总每个模块的总调用次数(total_calls),再取总调用次数最高的前2个模块,并计算每个模块的调用量占该租户所有模块总调用量的百分比(usage_pct)。
输出以下字段:租户名称(tenant_name)、套餐类型(plan_type)、模块名称(module_name)、模块总调用次数(total_calls)、调用占比百分比(usage_pct,即该模块总调用次数 / 该租户所有模块总调用次数 * 100,四舍五入保留2位小数)。结果按 tenant_id 升序排列,同一租户内按 total_calls 降序排列,若 total_calls 相同则按 module_name 升序排列。若某租户模块不足2个则显示全部模块;若某租户无调用记录则不出现在结果中。
三、示例数据表
tenants 表:
| tenant_id | tenant_name | plan_type | industry |
|---|---|---|---|
| 1 | 星辰科技 | 企业版 | 互联网 |
| 2 | 蓝海教育 | 专业版 | 教育 |
usage_logs 表:
| log_id | tenant_id | module_name | usage_date | call_count |
|---|---|---|---|---|
| 1 | 1 | 数据分析 | 2025-03-01 | 150 |
| 2 | 1 | 数据分析 | 2025-03-02 | 200 |
| 3 | 1 | 用户管理 | 2025-03-01 | 80 |
| 4 | 1 | 用户管理 | 2025-03-02 | 120 |
| 5 | 1 | 文件存储 | 2025-03-01 | 50 |
| 6 | 1 | 文件存储 | 2025-03-02 | 30 |
| 7 | 2 | 在线课堂 | 2025-03-01 | 300 |
| 8 | 2 | 题库系统 | 2025-03-01 | 180 |
| 9 | 2 | 学员管理 | 2025-03-01 | 120 |
四、示例数据查询结果表
说明:
-
星辰科技:数据分析=350,用户管理=200,文件存储=80,租户总计=630。Top2为数据分析和用户管理。
- 数据分析占比:350/630*100=55.56
- 用户管理占比:200/630*100=31.75
-
蓝海教育:在线课堂=300,题库系统=180,学员管理=120,租户总计=600。Top2为在线课堂和题库系统。
- 在线课堂占比:300/600*100=50.00
- 题库系统占比:180/600*100=30.00
| tenant_name | plan_type | module_name | total_calls | usage_pct |
|---|---|---|---|---|
| 星辰科技 | 企业版 | 数据分析 | 350 | 55.56 |
| 星辰科技 | 企业版 | 用户管理 | 200 | 31.75 |
| 蓝海教育 | 专业版 | 在线课堂 | 300 | 50.00 |
| 蓝海教育 | 专业版 | 题库系统 | 180 | 30.00 |

