SQL 刷题/【阿里巴巴】使用 LATERAL JOIN 查询租户 Top2 功能模块及调用占比
上一题下一题困难通过率 100%

【阿里巴巴】使用 LATERAL JOIN 查询租户 Top2 功能模块及调用占比

JOIN 连接聚合函数GROUP BY窗口函数用户行为分析面试真题

题目描述

来源:阿里 SQL 面试真题

某企业级 SaaS 平台为不同行业的租户提供多个功能模块,例如数据分析、用户管理和文件存储。产品团队需要分析每个租户最依赖的核心功能模块,并计算这些模块的调用量在该租户总调用量中的占比,用于指导功能迭代优先级和个性化套餐推荐。

数据表

tenants 租户表

字段类型说明
tenant_idINT租户编号,主键
tenant_nameVARCHAR(50)租户名称
plan_typeVARCHAR(20)套餐类型:基础版 / 专业版 / 企业版 / 旗舰版
industryVARCHAR(30)所属行业

usage_logs 功能调用日志表

字段类型说明
log_idINT日志编号,主键
tenant_idINT租户编号,关联 tenants.tenant_id
module_nameVARCHAR(30)功能模块名称
usage_dateDATE调用日期
call_countINT当日调用次数,保证 ≥ 1

问题

请使用 LATERAL JOIN 查询每个租户调用量最高的前 2 个功能模块,并计算每个模块的调用量占比。

具体规则:

  1. 先按 tenant_id × module_name 汇总模块总调用次数 total_calls。
  2. 对每个租户按 total_calls 降序取前 2 个模块。
  3. total_calls 相同时,按 module_name 升序决定排名。
  4. usage_pct = total_calls / 该租户所有模块总调用次数 × 100,四舍五入保留 2 位小数。
  5. 某租户模块不足 2 个时,输出该租户的全部模块;无调用记录的租户不输出。

输出字段

字段说明
tenant_name租户名称
plan_type套餐类型
module_name功能模块名称
total_calls模块总调用次数
usage_pct模块调用量占该租户所有模块总调用量的百分比

结果按 tenant_id 升序;同一租户内按 total_calls 降序,若相同则按 module_name 升序。

数据样例

当前运行环境
tenant_idPKINTtenant_nameVARCHAR(50)plan_typeVARCHAR(20)industryVARCHAR(30)
1星海零售专业版零售
2远航银行企业版金融
3启明教育基础版教育
4恒岳制造旗舰版制造
输入数据显示 4 / 4
SQL 编辑器正在保存草稿...
正在加载 SQL 编辑器...

运行你的 SQL 查询后,结果将显示在这里