【问题标题】:Selecting Top 10 Employee Salaries选择前 10 名员工薪水
【发布时间】:2015-09-29 22:01:46
【问题描述】:

我有一个员工工资数据库。

这里是Salaries 表字段:

emp_no INT(11)
salary INT(11)
from_date DATE
to_date DATE

我正在尝试获取前 10 名员工的薪水,非重复员工。使用下面的代码,我可以获得 emp_no 的最高工资,但我的 from_date 和 to_date 默认为该 emp_no 的最早日期值。

select emp_no, max(salary) as salary, from_date, to_date
from salaries
group by emp_no
order by salary DESC
limit 10

我假设GROUP BY 会保留与薪水和emp_no 匹配的日期的值,但是在考虑了一下之后,这样做没有任何意义。

非常感谢任何有关如何获取正确日期值的帮助。

【问题讨论】:

  • 您能解释一下为什么在 SELECT 中需要 from_date、to_date 吗?
  • 问题是你不能select 上包含字段,如果你没有在group by 上包含它
  • 作业要求。
  • 做同样的emp_no在桌子上出现几次还是桌子上的主键?
  • 那么,您既​​需要最高薪水,也需要支付这些薪水的日期,对吧?

标签: mysql sql phpmyadmin


【解决方案1】:

第一个表将包含前 10 名的薪水。

然后您检查原始表以查看哪一行与emp_nosalary 匹配以获取日期。

SELECT S.*
FROM  
    (SELECT emp_no, max(salary) as salary
     FROM salaries
     GROUP BY emp_no
     ORDER BY salary DESC
     limit 10
   ) maxSal
INNER JOIN salaries S
   ON maxSal.emp_no = S.emp_no
  AND maxSal.salary = S.salary

【讨论】:

  • 那么你唯一的方法就是加入一个连接,然后匹配emp_no和salary?
  • OracleSqlServer等其他rdbms中,您可以使用row_number(),但mySQL非常有限
  • 好的,谢谢你的帮助。现在从另一个关系添加名称。
  • 当您有一个员工有两个时期的最高工资相同时,此查询的表现如何?
  • @IhorKaharlichenko 你会得到一个随机的行。但在这种情况下,我认为假设你不会得到相同的薪水是安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多