sql根据字段获取最大值

时间:2012-03-06 19:35:35

标签: sql

我需要根据最高金额来获取ID。下面给我一个错误

   select  ID from Prog 
   where Amount = MAX(Amount)

聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。

最终结果是我需要获得正确的ID,因为我需要将其传递给期待它的其他东西。

5 个答案:

答案 0 :(得分:3)

您需要按金额订购,然后选择1条记录......

SELECT ID
FROM Prog
ORDER BY Amount DESC
LIMIT 1;

这会占用Prog中的所有行,按Amount降序排序(换句话说,第一个排序的行具有最高Amount),然后将查询限制为只选择一行(Amount最高的一行)。

此外,子查询对性能不利。此代码作为子查询版本在一半的时间内在具有200k记录的表上运行。

答案 1 :(得分:2)

如果您正在使用应该执行此操作的SQL Server:

SELECT TOP 1 ID 
FROM Prog
ORDER BY Amount DESC 

答案 2 :(得分:2)

只需将带有max值的子查询传递给where子句:

   select  ID from Prog 
   where Amount = (SELECT MAX(Amount) from Prog)

答案 3 :(得分:1)

这应该是这样的:

select P.ID from Prog P
where P.Amount = (select max(Amount) from Prog)

编辑:

如果你真的只想要一行,你应该这样做:

select max(P.ID) from Prog P
where P.Amount = (select max(Amount) from Prog);

但是,如果你有多行可以匹配金额,而你只想要一行,那么你应该在选择一行的方式背后有一些逻辑。不仅仅依赖于这个最大技巧,或limit 1类型逻辑。

另外,我不写limit 1,因为这不是ANSI sql - 它在mysql中工作但是OP没有说出他想要的东西。每个数据库都不同 - 请参阅此处:Is there an ANSI SQL alternative to the MYSQL LIMIT keyword?不要习惯一个数据库的扩展,除非你只想在你的余生中工作1分贝。

答案 4 :(得分:-1)

select min(ID) from Prog 
where Amount in 
(
    select max(amount)
    from prog
)

min语句确保您只获得一个结果。