jello jey :
Consider this schema:
create table Employee(
id integer,
name varchar(100),
position varchar(100),
id_department integer
);
create table Salary(
id_employee integer,
year integer,
month integer,
salary float
);
create table Department(
id integer,
name varchar(100)
);
I want to gather Employees that are ranked between 3rd and 5th place based on their average yearly salary per department, but I am a bit stumped. After some searching, I couldn't quite find a solution that worked for me.
Here's what I have as of now:
SELECT Employee.*, avg_salary
FROM Employee
INNER JOIN (
SELECT id_employee, sum(salary) / count(distinct(year)) as avg_salary
FROM Salary
GROUP BY id_employee
)
AS T on Employee.id = id_employee
ORDER BY Employee.id_department, avg_salary;
This gets me correctly ranked Employees, but how do I get only the ones that are ranked 3-5 in their department?
I'm using MySQL 5.x, but upgrading to 8.x is not an issue.
GMB :
In MySQL 8.0, one option is to use a ranking function; this requires turning your existing query to a subquery:
select *
from (
select
e.*,
s.avg_salary,
row_number() over(partition by e.id_department order by s.avg_salary desc) rn
from employee e
inner join (
select id_employee, sum(salary) / count(distinct(year)) as avg_salary
from salary
group by id_employee
) s on s.employee.id = e.id
) t
where rn between 3 and 5
order by id_department, avg_salary;
Guess you like
Origin http://43.154.161.224:23101/article/api/json?id=297485&siteId=1