2016-02-06 122 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