2016-02-06 117 views
2

我有一个表,名为:customers选择最大值的记录

我试图得到有最高工资的人的名字和工资。

所以我已经试过这样:

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

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

Column 'CUSTOMERS.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

我知道我应该的名字列添加到group by条款,但我得到的所有记录的表格。

我知道我可以做到这一点:

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

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

回答

3

该要求并不适用于group byhaving解决方案。最简单的方法来做到这一点,假设你使用MS SQL Server的一个现代版本insh,就是用rank窗函数:

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

没有必要的,并具有有子句中使用组,你懂。但是,如果你想使用他们,那么查询应该是

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

这只是OP的查询的一个更复杂的版本,它也不起作用。 – dnoeth

+0

当然这个查询工作。 你会得到什么错误? – masuduzzaman

+0

你会得到:“* Column'CUSTOMERS.name'在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中*” –

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