【问题标题】:Limiting MySQL select based on repeating column values?基于重复列值限制 MySQL 选择?
【发布时间】:2020-03-15 19:53:00
【问题描述】:

考虑这个架构:

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)
);

我想根据每个部门的平均年薪收集排名在第 3 和第 5 位之间的员工,但我有点难过。经过一番搜索,我找不到适合我的解决方案。

这是我目前所拥有的:

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;

这可以让我获得正确排名的员工,但我如何只获得他们部门中排名 3-5 的员工?

我使用的是 MySQL 5.x,但升级到 8.x 不是问题。

【问题讨论】:

  • 您是否尝试在查询后附加LIMIT 2,3 以获取第 3 行、第 4 行和第 5 行?
  • 确实,这是我的第一直觉。但这总共产生 3 行,而不是每个部门 ID 3 行。
  • 您使用哪个版本的 MySQL?请edit您的问题。
  • 请注意,钱很少是浮动的;这就是发明十进制的原因
  • @O.Jones 很抱歉给您带来不便,补充了缺失的信息。

标签: mysql sql join group-by


【解决方案1】:

在 MySQL 8.0 中,一种选择是使用排名函数;这需要将您现有的查询转换为子查询:

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;

【讨论】:

  • 这正是我一直在寻找的,向你致敬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2021-09-30
  • 2019-04-10
  • 2018-08-24
相关资源
最近更新 更多