我在员工表中有以下结果:
ID | Name | Number
---------------------
1 | Dani | 15
2 | Dani | 20
3 | Yara | 10
我需要编写sql查询以获得以下结果:
ID | Name | Number
------------------
2 | Dani | 20
3 | Yara | 10
如您所见,如果结果包含员工的常用名称,则查询必须获取最大值(数字)。
我怎么能这样做?
答案 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上正常工作,因为它们都支持窗口函数。
答案 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"
请注意,这会独立计算ID
和Number
的最大值。例如,如果您有此数据集:
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)
您想要找到每个名称的最大值,然后使用Name
和Number
将其连接回原始表格,以便您可以访问其所有值(例如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)
您可以使用max
和group by
子句尝试以下内容:
select max(t.ID)
, t.Name
, max(t.Number)
from employee t
group by t.Name