从重复记录中选择薪水最高的记录

时间:2017-08-20 16:24:23

标签: sql select

从具有相同名称和不同薪水的重复记录中选择薪水最高的员工记录

id|name|salary
1 | A  | 500
2 | B  | 100
3 | A  | 400
3 | B  | 200

输出

1 | A  | 500
3 | B  | 200

请发布适用于所有数据库的通用sql。

我尝试过以下查询。但如果重复不存在,则不会返回记录。

select e.id,e.name,e.salary FROM employee e,
    employee e1 
WHERE
    e.name = e1.name
    AND e.salary > e1.salary

3 个答案:

答案 0 :(得分:1)

任何合理的现代数据库(都是值得注意的例外)应该支持窗口函数。 rank()应该做到这一点:

SELECT id, name, salary
FROM   (SELECT id, name, salary, 
               RANK() OVER (PARTITION BY name ORDER BY salary DESC) rk
        FROM   some_table) t
WHERE  rk = 1

答案 1 :(得分:1)

在可行的SQL Server中(我目前没有其他SGDB,但它不应该很难适应它):

select s.* 
from salaries s
join (
    select name,MAX(salary) as maxsalary 
    from salaries 
    group by name) ms on s.name=ms.name and s.salary=ms.maxsalary

子查询选择代表最高工资的行。主查询根据两个参数进行过滤:名称和最高工资。

答案 2 :(得分:1)

使用NOT EXISTS

SELECT s1.id, s1.name, s1.salary
FROM salaries s1
WHERE NOT EXISTS
(
  SELECT *
  FROM salaries s2
  WHERE s1.name = s2.name AND s1.salary < s2.salary
)

使用ALL

SELECT s1.id, s1.name, s1.salary
FROM salaries s1
WHERE s1.salary >=
ALL(
  SELECT salary
  FROM salaries s2
  WHERE s1.name = s2.name
)