在获取列的MAX值时从表中选择数据

时间:2016-02-05 08:48:42

标签: sql sql-server sql-server-2008

QUERY:

我有一个包含UserId和FirstName

等列的表

我想做的是:

如果获得UserId

,我想获取最大值

我的新手尝试:

select FirstName from tblUsers where MAX(UserId)=@UserId

显示错误:

  

聚合可能不会出现在WHERE子句中,除非它在a中   包含在HAVING子句或选择列表中的子查询以及列   被聚合是一个外部参考。

也欢迎没有@UserId的查询

4 个答案:

答案 0 :(得分:1)

尝试在以下内容中使用HAVING

select FirstName 
from tblUsers 
group by FirstName
having MAX(UserId)=@UserId

更新1

如果您只想获得FirstName最高的UserId,则可以使用以下TOP 1

select top 1 FirstName
from tblUsers
order by UserId desc

更新2

我不建议使用此解决方案,但如果您希望(出于任何原因)使用MAX(UserId),您可以执行以下操作:

select FirstName
from tblUsers
group by FirstName
having max(UserId ) = (select max(UserId) from tblUsers)

答案 1 :(得分:0)

select FirstName from tblUsers group by FirstName having MAX(UserId)=@UserId

HAVING就像聚合表达式的where子句。

但这似乎对我没有意义。如果@UserId是表格中的最大用户ID,您只会获得一行,所以我不太了解您的需求。

答案 2 :(得分:0)

where子句不支持聚合,因为下面是逻辑查询阶段

from
where
group by
having
select 
order by 
top

所以在你的情况下,SQL会转到你的表和where子句,你要求聚合的结果在那个时间点是未知的,因为SQL在这个阶段只知道表列...因为我们使用group by进行聚合,有权访问group by结果的下一个运算符,所以你必须引用任何聚合来使用或使用派生表或cte

答案 3 :(得分:0)

与其他人一致,您应该尝试更明确地说明您想要的内容。阅读完Stanislovas'回答我认为这就是你想要的:

SELECT FirstName
FROM   tblUsers
WHERE  UserId =
      (SELECT MAX(UserId)
       FROM   tblUsers
      )

子查询首先选择最大的UserId值,然后将其用作值以选择相应的FirstName。