从列表结果中获取最大值

时间:2014-05-01 21:54:21

标签: sql sql-server oracle

我在员工表中有以下结果:

 ID | Name  | Number
---------------------
1   | Dani  |  15
2   | Dani  |  20
3   | Yara  |  10

我需要编写sql查询以获得以下结果:

ID | Name | Number
------------------
2  | Dani |   20  
3  | Yara |   10

如您所见,如果结果包含员工的常用名称,则查询必须获取最大值(数字)。

我怎么能这样做?

4 个答案:

答案 0 :(得分:5)

由于您还希望正确的id指向最大值,因此这是最简单的方法:

WITH TT AS (
    SELECT ID, Name, Number, rank() OVER(PARTITION BY Name ORDER BY Number DESC) R
    FROM employee
)
SELECT ID, Name, Number
FROM TT
WHERE R = 1;

它应该在Oracle和SQL Server上正常工作,因为它们都支持窗口函数。

SQLFiddle example using Oracle

答案 1 :(得分:1)

从您提供的数据集中,您只需使用GROUP BY子句即可。您提到的各种引擎中的语法都非常相似。

在MySQL中:

SELECT MAX(`ID`), `Name`, MAX(`Number`)
FROM `Employee`
GROUP BY `Name`

在T-SQL(SQL Server)中:

SELECT MAX([ID]), [Name], MAX([Number])
FROM [Employee]
GROUP BY [Name]

在Oracle中:

SELECT MAX("ID"), "Name", MAX("Number")
FROM "Employee"
GROUP BY "Name"

请注意,这会独立计算IDNumber的最大值。例如,如果您有此数据集:

ID - Name - Number
 1 - Dani - 20
 2 - Dani - 15
 3 - Yara - 10

你得到这个结果:

ID - Name - Number
 2 - Dani - 20
 3 - Yara - 10

请注意ID的{​​{1}}为2,因为它是Dani的{​​{1}}列的最大值。如果您想获得ID 1,那么使用Vincent's solution可能会更好。

答案 2 :(得分:1)

您想要找到每个名称的最大值,然后使用NameNumber将其连接回原始表格,以便您可以访问其所有值(例如ID)< / p>

SELECT t.*
   FROM Employee e
   JOIN (SELECT Name, MAX(Number) AS Number
            FROM Employee e
            GROUP BY Name) maxnum ON maxnum.Number = e.Number AND maxnum.Name = e.Name

答案 3 :(得分:0)

您可以使用maxgroup by子句尝试以下内容:

select max(t.ID)
     , t.Name
     , max(t.Number) 
from employee t
group by t.Name