在employee表中有以下结果:
ID | Name | Number
---------------------
1 | Dani | 15
2 | Dani | 20
3 | Yara | 10我需要编写sql查询以获得以下结果:
ID | Name | Number
------------------
2 | Dani | 20
3 | Yara | 10如您所见,如果包含员工频繁名称的结果,则查询必须获得最大值(数字)。
我怎么能这么做?
发布于 2014-05-01 21:58:23
由于您还需要指向最大值的正确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和Server上正确工作,因为它们都支持窗口功能。
SQLFiddle example using Oracle
发布于 2014-05-01 21:56:35
根据您提供的数据集,您可以简单地使用GROUP BY子句。您提到的各种引擎中的语法都非常相似。
在MySQL中:
SELECT MAX(`ID`), `Name`, MAX(`Number`)
FROM `Employee`
GROUP BY `Name`在T(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 for Dani是2,因为这是Dani的ID列的最大值。如果您想获得1的ID,那么使用 solution可能会更好。
发布于 2014-05-01 21:59:59
您希望找到每个名称的最大值,然后使用Name和Number将其连接回原始表,以便可以访问其所有值(如ID)。
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.Namehttps://stackoverflow.com/questions/23417309
复制相似问题