[英]sql get max based on field
我需要从最大金额中获取ID。 下面给我一个错误
select ID from Prog
where Amount = MAX(Amount)
除非聚集在HAVING子句或选择列表中包含的子查询中,并且聚集的列是外部引用,否则聚集可能不会出现在WHERE子句中。
最终结果是,我需要获取唯一的ID,就像我需要将其传递给其他期望的那样。
您需要按金额排序,然后选择1条记录...
SELECT ID
FROM Prog
ORDER BY Amount DESC
LIMIT 1;
这将接受Prog
所有行,并按Amount
降序对其进行排序(换句话说,第一个排序的行具有最高的Amount
),然后将查询限制为仅选择一行(具有最高Amount
)。
而且,子查询对性能不利。 此代码在具有200k条记录的表上运行,所需时间是子查询版本的一半。
如果您使用的是SQL Server,则应该这样做:
SELECT TOP 1 ID
FROM Prog
ORDER BY Amount DESC
只需将具有最大值的子查询传递给where子句:
select ID from Prog
where Amount = (SELECT MAX(Amount) from Prog)
这应该是这样的:
select P.ID from Prog P
where P.Amount = (select max(Amount) from Prog)
编辑:
如果您确实只想要1行,则应该执行以下操作:
select max(P.ID) from Prog P
where P.Amount = (select max(Amount) from Prog);
但是,如果您有多行要与金额匹配,而您只想要1行,那么在选择一行时应该具有某种逻辑。 不仅仅依靠这个最大技巧,或者limit 1
一种类型的逻辑。
另外,我不写limit 1
,因为这不是ANSI sql -它可以在mysql中工作,但是OP没有说出他想要什么。 每个数据库都是不同的-请参见此处: MYSQL LIMIT关键字是否有ANSI SQL替代方法? 除非您一生只想在1个db中工作,否则不要习惯一个db的扩展。
select min(ID) from Prog
where Amount in
(
select max(amount)
from prog
)
min语句可确保您仅获得一个结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.