Mysql 查找每个部门最年轻和最年长员工的工资

Mysql 查找每个部门最年轻和最年长员工的工资,mysql,sql,group-by,inner-join,having,Mysql,Sql,Group By,Inner Join,Having,有两张桌子 1) Employee id | Name | Department | Dob 2) Salary id | salary 我想找到每个部门最年轻和最年长员工的工资。 但是使用下面的查询,我无法获得正确的id,salary SELECT salary.id,employee.Dept,salary.salary,MIN(employee.DoB) from employee INNER JOIN salary ON salary.id = employee.id GR

有两张桌子

1) Employee
id | Name |  Department | Dob 

2) Salary
id | salary
我想找到每个部门最年轻和最年长员工的工资。 但是使用下面的查询,我无法获得正确的id,salary

SELECT salary.id,employee.Dept,salary.salary,MIN(employee.DoB) 
from employee 
INNER JOIN salary ON salary.id = employee.id  GROUP by Dept

上面的查询返回的是正确的Dob,但是ID和工资与出生日期不匹配。如果您运行的是MySQL 8.0,只需使用窗口函数:

select *
from (
    select 
        e.*, 
        s.salary,
        row_number() over(partition by department order by dob asc) rn_asc,
        row_number() over(partition by department order by dob desc) rn_desc
    from employee e
    inner join salary s on s.id = employee.id
) t
where 1 in (rn_asc, rn_desc)
在早期版本中,一个选项是使用聚合查询进行连接:

select e.*, s.salary
from employee e
inner join salary s on s.id = employee.id
inner join (
    select department, min(dob) min_dob, max(dob) max_dob 
    from employee
    group by department
) d on d.department = e.department and e.dob in (d.min_dob, d.max_dob)

我想对相关子查询使用
=
两次:

select s.*, e.department
from salary join
     employee e
     on s.id = e.id
where e.dob = (select min(e2.dob) from employee e where e2.department = e.department) or
      e.dob = (select max(e2.dob) from employee e where e2.department = e.department) ;

员工(部门,dob)
上有一个索引,我希望这会有很好的性能。

除了那些设置函数的参数之外,您通常按照选择的相同列进行分组。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。给出你能给出的最少代码,即你显示的代码是OK的,扩展为你显示的代码是不OK的。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。停止尝试编码你的总体目标,并解释你期望从给定的代码中得到什么以及为什么。谢谢你的回答。这两个问题对我都有效