目录
题目
准备数据
分析数据
题目
编写一个解决方案来获取每一个被分配到组中的雇员的 team_id
。
返回的结果表按照 team_id
升序排列。如果相同,则按照 employee_id
升序排列。
这家公司想要将 工资相同 的雇员划分到同一个组中。每个组需要满足如下要求:
- 每个组需要由 至少两个 雇员组成。
- 同一个组中的所有雇员的 工资相同。
- 工资相同的所有雇员必须被分到同一个组中。
- 如果某位雇员的工资是独一无二的,那么它 不 被分配到任何一个组中。
- 组ID的设定基于这个组的工资相对于其他组的 工资的排名,即工资 最低 的组满足
team_id = 1
。注意,排名时 不需要考虑 没有组的雇员的工资。
准备数据
Create table If Not Exists Employees (employee_id int, name varchar(30), salary int);
Truncate table Employees;
insert into Employees (employee_id, name, salary) values ('2', 'Meir', '3000');
insert into Employees (employee_id, name, salary) values ('3', 'Michael', '3000');
insert into Employees (employee_id, name, salary) values ('7', 'Addilyn', '7400');
insert into Employees (employee_id, name, salary) values ('8', 'Juan', '6100');
insert into Employees (employee_id, name, salary) values ('9', 'Kannon', '7400');
分析数据
第一步:通过开窗函数dense_rank()将薪水相同的排名相同,并且统计薪水相同的个数
select
employee_id,name,salary,
dense_rank() over(order by salary) rn,
count(*) over(partition by salary) cn
from employees;
第二步:排除工资相同的只有一个雇员的情况
with t1 as(
select
employee_id,name,salary,
dense_rank() over(order by salary) rn,
count(*) over(partition by salary) cn
from employees
),t2 as (
select
employee_id, name, salary
from t1
where cn >= 2
)select * from t2;
第三步:再根据薪水进行排名,并且最后结果表按照 team_id
升序排列。如果相同,则按照 employee_id
升序排列。
with t1 as(
select
employee_id,name,salary,
dense_rank() over(order by salary) rn,
count(*) over(partition by salary) cn
from employees
),t2 as (
select
employee_id, name, salary
from t1
where cn >= 2
),t3 as (
select
employee_id, name, salary,
dense_rank() over (order by salary) team_id
from t2
)select * from t3
order by team_id,employee_id;