簡體   English   中英

SQL:在列上返回具有最大值的多行

[英]SQL: return multiple rows with maximal value on a column

你可以從這里找到問題。

當每個部門有多個薪水最高的人時,下面的SQL命令輸出預期的結果——輸出所有薪水最高的員工:

select d.Name as Department, e.Name as Employee, e.Salary as Salary
from 
(select Name, Salary, DepartmentId
from Employee
having (Salary, DepartmentId) in (
    select max(Salary), DepartmentId
    from Employee
    group by DepartmentId)
)e, Department d
where e.DepartmentId = d.Id

但是,即使有多個工資最高的員工,以下命令也只輸出一名員工:

select d.Name as Department, e.Name as Employee, e.Salary as Salary
from 
(select Name, Salary, DepartmentId
from Employee
group by DepartmentId
having Salary = max(Salary)
)e, Department d
where e.DepartmentId = d.Id

誰能向我解釋為什么后者不起作用? 謝謝!

第二個查詢不起作用的原因是因為無論部門如何,它都會獲得最高工資。

盡管第一個查詢是有效的(它沒有像它應該的那樣使用標准的 JOIN 語法),我會這樣做的方式是首先獲得每個部門的最高薪水,如下所示:

SELECT departmentID, MAX(salary)
FROM employee
GROUP BY departmentID;

一旦有了它,您就可以使用自聯接來僅選擇具有該薪水和部門的行。 如果他們的薪水相同,這將包括多個人:

SELECT e.*
FROM employee e
JOIN(
   SELECT departmentID, MAX(salary) AS maxSalary
   FROM employee
   GROUP BY departmentID) tmp ON tmp.departmentID = e.departmentID AND tmp.maxSalary = e.salary

為了進一步解釋,請考慮您擁有的內部子查詢:

SELECT name, department, salary
FROM employee
GROUP BY department
HAVING salary = MAX(salary);

第一個問題是您選擇的行在您的組內不一致。 對於每個部門id,你有多個name值和多個salary值,在分組的時候會任意選擇。 在我的示例和第一個示例中,您可以看到分組明確地為每個部門的最大工資提取 (departmentID,salary) 對,而第二個沒有。

這是一個SQL Fiddle示例,可以直觀地查看您的第二個查詢和我的查詢之間的差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM