Limiting MySQL select based on repeating column values?

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