选择具有最大值的记录

时间:2016-02-06 12:36:36

标签: sql sql-server select

我有一个名为customers的表。

我试图获得薪水最高的人的姓名和工资。

所以我试过这个:

SELECT name, salary AS MaxSalary
FROM CUSTOMERS 
GROUP BY salary
HAVING salary = max(salary)

不幸的是,我收到了这个错误:

  

专栏' CUSTOMERS.name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我知道我应该在group by子句中添加name列,但是我得到了表的所有记录。

我知道我可以通过以下方式实现:

SELECT name, salary
FROM CUSTOMERS
WHERE salary = (SELECT MAX(salary) FROM CUSTOMERS)

但我想通过group byhaving条款来实现它。

3 个答案:

答案 0 :(得分:3)

此要求并不适合group byhaving解决方案。假设您使用的是现代版本的MS SQL Server,最简单的方法是使用rank窗口函数:

SELECT name, salary
FROM   (SELECT name, salary, RANK() OVER (ORDER BY salary DESC) rk
        FROM   customers) c
WHERE  rk = 1

答案 1 :(得分:1)

Mureinik的answer排名很好,但如果你因为某种原因不想要一个窗口函数,你可以使用CTE或子查询。

with mxs as (
  select
    max(salary) max_salary
  from
    customers
)
select
  name
  ,salary
from
  customers cst
  join mxs on mxs.max_salary = cst.salary

答案 2 :(得分:-1)

你知道,没有必要在那里使用group by和having子句。但是如果你想使用它们,那么查询应该是

SELECT name, salary 
FROM CUSTOMERS 
GROUP BY salary 
having salary = (select max(salary) from CUSTOMERS)