繁体   English   中英

sql根据字段获取最大

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM