蚂蚁面试SQL—分层贪心招聘问题

题目描述

某互联网大厂在进行员工招聘,给定固定的薪资预算【12万】,公司制定了如下贪心招聘策略:

  1. 优先招聘 高职级员工(P7>P6>P5)
  2. 在同一职级内,优先招聘期望薪资更低的候选人
  3. 在满足高职级招聘人数尽可能多的前提下,再考虑低职级
  4. 总招聘薪资不能超过预算

数据模拟

sql 复制代码
CREATE TABLE dwd_emp_candidate_di (
    candidate_id VARCHAR(20) COMMENT '候选者ID',
    level VARCHAR(20) COMMENT '应聘职级',
    salary DOUBLE COMMENT '预期薪资(单位:万)'
);

INSERT INTO dwd_emp_candidate_di VALUES
('001', 'P6', 2.5),
('002', 'P6', 2.5),
('003', 'P7', 5.0),
('004', 'P7', 4.5),
('005', 'P7', 4.0),
('006', 'P6', 3.0),
('007', 'P5', 2.0),
('008', 'P5', 1.8);

思路分析

  • 本题本质上是一个 带有优先级约束的贪心选择问题
    • 首先将P7员工按照薪资排序,优先招聘工资较低的员工,确保不会超过预算,计算剩余预算
    • 然后再将P6员工按照薪资排序,优先招聘工资较低的员工,确保不会超过上述剩余预算,计算剩余预算
    • 以此类推

参考答案

sql 复制代码
WITH
p7_ranked AS (
    SELECT
        candidate_id,
        level,
        salary,
        SUM(salary) OVER (ORDER BY salary) AS running_salary,
        row_number() over (ORDER BY salary) AS rk
    FROM dwd_emp_candidate_di
    WHERE level = 'P7'
),
p7_hired AS (
    SELECT *
    FROM p7_ranked
    WHERE running_salary <= 12
),
p7_budget AS (
    SELECT COALESCE(SUM(salary), 0) AS used_budget
    FROM p7_hired
),
p6_ranked AS (
    SELECT
        candidate_id,
        level,
        salary,
        SUM(salary) OVER (ORDER BY salary) AS running_salary
    FROM dwd_emp_candidate_di
    WHERE level = 'P6'
),
p6_hired AS (
    SELECT p6.*
    FROM p6_ranked p6
    JOIN p7_budget b
    ON 1 = 1
    WHERE p6.running_salary <= (12 - b.used_budget)
),
p6_budget AS (
    SELECT COALESCE(SUM(salary), 0) AS used_budget
    FROM p6_hired
),
p5_ranked AS (
    SELECT
        candidate_id,
        level,
        salary,
        SUM(salary) OVER (ORDER BY salary) AS running_salary
    FROM dwd_emp_candidate_di
    WHERE level = 'P5'
),
p5_hired AS (
    SELECT p5.*
    FROM p5_ranked p5
    JOIN p7_budget b7
    ON 1 = 1
    JOIN p6_budget b6
    ON 1 = 1
    WHERE p5.running_salary <= (12 - b7.used_budget - b6.used_budget)
)
SELECT candidate_id, level, salary FROM p7_hired
UNION ALL
SELECT candidate_id, level, salary FROM p6_hired
UNION ALL
SELECT candidate_id, level, salary FROM p5_hired;
相关推荐
四七伵6 小时前
Spring Boot项目中varchar字段为什么不用NULL?告别空指针从建表开始
数据库·后端
Mr.45676 小时前
JDK17+Druid+SpringBoot3+ShardingSphere5 多表分库分表完整实践(MySQL+PostgreSQL)
java·数据库·spring boot·mysql·postgresql
根哥的博客7 小时前
Flink on Yarn 任务启动后,暴露端口无授权访问漏洞,用iptables批量解决
大数据·flink·flink未授权访问
l14372332677 小时前
短剧出海翻译工具测评:同一段素材实测对比
大数据·前端·人工智能
Elastic 中国社区官方博客7 小时前
使用 ES|QL 变量控件将仪表板转变为调查工具
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·全文检索
feng68_7 小时前
Ansible还原数据库节点
linux·运维·数据库·ansible
乐hh7 小时前
清理MySQL数据
数据库·mysql
EasyCVR7 小时前
国标GB28181/RTSP/ONVIF/RTMP视频监控平台EasyCVR视频质量诊断花屏/蓝屏/画面模糊/冻结检测
网络·数据库·音视频
C^h7 小时前
RTthread中的内存池理解
linux·数据库·c++·算法·嵌入式
fobwebs7 小时前
wordpress 网站安装了Yoast SEO,并且做了内容的优化后,如果想重置Yoast SEO,并且删除所有的优化内容,应该如何操作?
数据库·yoast seo·重置yoast seo·清空yoast seo内容