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

题目描述

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

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

数据模拟

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员工按照薪资排序,优先招聘工资较低的员工,确保不会超过上述剩余预算,计算剩余预算
  • 以此类推

参考答案

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;

#数据人的面试交流地#
大厂高频面试SQL题 文章被收录于专栏

收录字节、阿里、蚂蚁、美团、京东、百度、小红书、拼多多等大厂面试SQL题

全部评论
啥,你这结果对吗,id=5的招了2次?
1 回复 分享
发布于 02-27 19:52 北京
论了再看!楼主说出了我的心声,完全同意!
点赞 回复 分享
发布于 02-25 21:34 四川
with写法生产环境会用吗
点赞 回复 分享
发布于 02-12 13:47 广东

相关推荐

最近好多人问我这个问题,我自己也是纠结过很久,现在秋招春招走下来,多少有点感触了,写出来给大家参考参考。先说结论:没有绝对的好坏,取决于你处在哪个阶段、手里有什么牌、以及你缺什么。📌大厂实习优点很明显,大厂的title确实好用,简历关会好过很多,面试的时候面试官也更容易认可你的经历,毕竟流程规范、业务体量大,哪怕你干的活再边缘,说出去也是有背书效果的。而且大厂的实习流程相对成熟,mentor制度、内部文档这些都比较全,对第一次实习的人来说,能快速建立对流程工作的认识。不过缺点也存在,很多时候大厂实习生干的活真的很碎,可能会在大厂实习三个月,每天就是导数据、做周报、跟会议纪要,项目都没摸全。还有就是转正这件事,现在大厂hc锁得厉害,暑期实习转正都不一定稳,更别说日常实习了~📌小厂实习小厂的好处是你能接触到的东西更杂更全,我有一段中厂的经历,虽然公司不大,但因为人手少,我从运营到产品甚至商务都掺和过,面试的时候聊起来反而有很多可以讲的,因为真的亲手做了落地的东西。而且小厂的氛围通常更灵活,mentor可能就是直接带你的人,关系更近,学东西也更直接。缺点就是title确实吃亏,我投简历的时候明显感觉到,有些大厂筛简历就是看学校+实习公司名字,小厂经历有时候直接被忽略。还有就是小厂的流程不规范,有的公司去了就是自己摸索,没人带,成长全靠自己踩坑,体验差别很大。📌我自己的感受我三段实习里,有大厂也有中小厂,现在回头看,这样安排还不错:第一段实习可以去小厂,快速上手、积累能落地的项目经验;第二段争取去大厂,拿个title,看看规范化的工作流程;第三段,那就看自己缺什么,想转正就找有hc的,想刷简历就继续冲大厂。我发现面试官其实更在意的是你在实习里到底做了什么、有没有自己的思考,而不是单纯看公司名字。大厂经历是敲门砖,但聊得深了,还是看你有没有真东西。小厂经历只要你能讲清楚做了什么、解决了什么问题、有什么复盘,反而更容易出彩。最后想说,不管大厂小厂,能让你有成长、能给你空间去试错、能让你在面试时有东西可讲的,就是好厂。别太纠结,有offer先接着,实在不满意再骑驴找马,总比干等着强!
大厂实习和小厂实习最大的...
点赞 评论 收藏
分享
评论
5
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务