MySQL高阶2004-职员招聘人数

目录

题目

准备数据

分析数据

实现


题目

一家公司想雇佣新员工。公司的工资预算是 70000 美元。公司的招聘标准是:

  1. 雇佣最多的高级员工。
  2. 在雇佣最多的高级员工后,使用剩余预算雇佣最多的初级员工。

编写一个SQL查询,查找根据上述标准雇佣的高级员工和初级员工的数量。

任意顺序 返回结果表。

准备数据

sql 复制代码
Create table If Not Exists Candidates (employee_id int, experience ENUM('Senior', 'Junior'), salary int)
    Truncate table Candidates
    insert into Candidates (employee_id, experience, salary) values ('1', 'Junior', '10000')
    insert into Candidates (employee_id, experience, salary) values ('9', 'Junior', '10000')
    insert into Candidates (employee_id, experience, salary) values ('2', 'Senior', '20000')
    insert into Candidates (employee_id, experience, salary) values ('11', 'Senior', '20000')
    insert into Candidates (employee_id, experience, salary) values ('13', 'Senior', '50000')
    insert into Candidates (employee_id, experience, salary) values ('4', 'Junior', '40000');

分析数据

第一步:筛选"Senior"的累计salary总和

因为根据salary排序,所以开窗函数sum中salary相同的值相同,所以employee_id = 2 或 11的薪水都是40000

sql 复制代码
select employee_id,sum(salary) over(order by salary) total1 from candidates
where experience = 'Senior';

第二步:t2子查询选择最大值小于70000

sql 复制代码
with t1 as (
    select employee_id,sum(salary) over(order by salary) total1 from candidates
    where experience = 'Senior'
),t2 as (
    select max(total1) total from t1 where total1 <= 70000
)select * from t2;

第三步:筛选"Junior"的累计salary总和

sql 复制代码
with t1 as (
    select employee_id,sum(salary) over(order by salary) total1 from candidates
    where experience = 'Senior'
),t2 as (
    select max(total1) total from t1 where total1 <= 70000
),t3 as (
    select employee_id,sum(salary) over(order by salary) total2 from candidates
    where experience = 'Junior'
)select * from t3;

第四步:第一个子查询从t1中选择"Senior"中小于或等于70000,第二个select子查询再从t2和t3中选择"Junior"出小于70000减去第一个select子查询.最后通过union all将两个结果结合起来.

sql 复制代码
with t1 as (
    select employee_id,sum(salary) over(order by salary) total1 from candidates
    where experience = 'Senior'
),t2 as (
    select max(total1) total from t1 where total1 <= 70000
),t3 as (
    select employee_id,sum(salary) over(order by salary) total2 from candidates
    where experience = 'Junior'
)
select 'Senior' as experience,count(distinct  employee_id) accepted_candidates from t1
where total1 <= 70000
union all
select 'Junior' as experience,count(distinct  employee_id) accepted_candidates from t2,t3
where total2 < 70000 - ifnull(total,0);

实现

sql 复制代码
with t1 as (
    select employee_id,sum(salary) over(order by salary) total1 from candidates
    where experience = 'Senior'
),t2 as (
    select max(total1) total from t1 where total1 <= 70000
),t3 as (
    select employee_id,sum(salary) over(order by salary) total2 from candidates
    where experience = 'Junior'
)
select 'Senior' as experience,count(distinct  employee_id) accepted_candidates from t1
where total1 <= 70000
union all
select 'Junior' as experience,count(distinct  employee_id) accepted_candidates from t2,t3
where total2 < 70000 - ifnull(total,0)
;
相关推荐
qq_1249870753几秒前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha1 分钟前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_6 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance12 分钟前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋37 分钟前
【Redis】主从复制
数据库·redis
马猴烧酒.1 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82181 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
大巨头2 小时前
sql2008 数据库分页语句
数据库
m0_715575342 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
老邓计算机毕设2 小时前
SSM智慧社区家政服务系统80q7o(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架