【问题标题】:Selecting a data from table while fetching the MAX value of a column在获取列的 MAX 值时从表中选择数据
【发布时间】:2016-02-05 17:44:31
【问题描述】:

查询:

我有一个包含 UserId 和 FirstName 等列的表

我想做的是:

我想在获取最大 if UserId 的同时获取 FirstName

我的新手尝试:

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

显示错误:

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

也欢迎不带@UserId 的查询

【问题讨论】:

  • 能否包含样本数据和预期输出?尽管下面的答案会满足您的要求,但我不确定这是否正是您想要的。一些演示记录应该可以帮助我们解决这个问题。
  • UserID是主键吗?
  • 无法说出你想要完成什么
  • 是的,它的 PK 和 Bigint @jarlh
  • 你能帮我做一个查询,它将为我提供最大 UserId 的名字。这就是我要求的全部

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


【解决方案1】:

尝试在下面使用HAVING

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

更新 1

如果您只想获得UserId 最高的 1 个FirstName,您可以在下面使用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)

【讨论】:

  • @Arka 不工作还不够。如果您想获得正确答案,您应该提供更多信息。什么不工作?你有错误吗?结果不正确?还提供样本数据和所需的输出。
  • 你能帮我做一个查询,它将为我提供最大 UserId 的名字。这就是我所要求的。
  • 这个问题只是试图解决它。@Stanislovas
  • 可以的,不过最好用TOP 1update an answer with solution。
  • UPDATE 1 对我来说很好......:)
【解决方案2】:
select FirstName from tblUsers group by FirstName having MAX(UserId)=@UserId

HAVING 类似于聚合表达式的 where 子句。

但这对我来说似乎没有意义。如果@UserId 是表中的最大用户 ID,你只会得到一行,所以我不太明白你想要什么。

【讨论】:

  • 如果你想使用有,你必须使用 group by,这也是重复的答案。
  • 我想在单个查询中获得最大 UserId 的名字
  • 但是@UserId 可能没有最大的UserId - @UserId 有什么用?我认为 HAVING UserId = MAX(UserId) 可能是您想要的,但我不明白 @UserId 的用途。
  • 你能帮我做一个查询,它将为我提供最大 UserId 的名字。这就是我要求@AbeCrabtree
  • 那么第一个答案毕竟是你想要的:“SELECT FirstName FROM tblUsers HAVING UserId = MAX(UserId)”。这在 Sybase 上对我有用,但我不完全确定它没有使用 Sybase Sql 扩展,所以你需要尝试一下。
【解决方案3】:

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

from
where
group by
having
select 
order by 
top

因此,在您的情况下,SQL 转到您的表,并且在 where 子句中您询问当时未知的聚合结果,因为 SQL 在此阶段只知道表列...因为我们使用 group by 进行聚合,下一个可以访问分组结果的运算符是有,所以你必须在拥有或使用派生表或 cte 时引用任何聚合

【讨论】:

    【解决方案4】:

    同意其他人的观点,即您应该尝试更明确地说明您到底想要什么。在阅读了您对 Stanislovas 回答的第二条评论后,我认为这就是您想要的:

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

    子查询首先选择最大的UserId值,然后将其作为值来选择对应的FirstName。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      相关资源
      最近更新 更多