【问题标题】:How to use max function with select top in sql如何在sql中使用max函数和select top
【发布时间】:2015-05-29 07:41:40
【问题描述】:

我有一个表,我们称之为 TempAccount,其中有一个名为 AccountID 的列。它包含来自 1、2、3...等的数字。

我的要求是我应该从前 10 个 AccountID 中选择最大值。

我知道我可以通过创建一个临时表并在其中插入前 10 个值然后从该表中选择最大值来做到这一点。但我希望是否有任何直接查询可以用来实现这一点。

类似MAX(SELECT TOP 10 AccountID FROM TempAccount)

我可以实现这一目标的最佳方法是什么?

注意:我使用的是 SQL Server 2012

【问题讨论】:

  • 如何定义前 10 个帐户 ID?
  • 最大值是任何其他表的同一表中的列吗?
  • @wewestthemenace 假设表有 1000 个值。我想选择前 10 名,并且我想选择最大值。如果我直接使用 max 它会给我该表中所有值的最大值
  • @AnilKumat 同桌
  • @nitinvertigo 按顺序将数据填充到表中并不能保证您会以相同的顺序将其取出。您必须指定订单以确保

标签: sql sql-server sql-server-2012


【解决方案1】:

您可以使用 CTE 查询。示例:

WITH CTEQuery (AccountId) AS (
    SELECT TOP 10 AccountId 
    FROM TempAccount
    ORDER BY AccountId
)
SELECT MAX(AccountId) 
FROM CTEQuery

【讨论】:

  • 我希望您知道 CTE 返回的“前 10”行不能保证?您没有指定 ORDER BY,因此 TOP 10 基本上可以返回它喜欢的任何 10 行。
  • @Oliver TempAccount 表中的数据是按我想要的格式(升序)预先填充的,所以我不需要在 CTE 中指定 ORDER BY
  • @nitinvertigo:您是正确的,您的 SQL Server 版本截至目前的行为是这样的。我知道小型 SQL Server 表通常以这种方式运行。尽管如此,这种行为既不受 SQL 标准的保证,也不受 SQL Server 文档的保证,您不应该依赖它,至少有 4 个原因。请参阅此处的反例:sqlblogcasts.com/blogs/sqlandthelike/archive/2010/06/27/…
  • 您还需要使用ORDER BY 子句。否则,即使结果可能已根据字段按升序插入表中,也无法保证结果的顺序。或者即使您在执行的几乎所有 SELECT 查询的结果中都看到了它。 Microsoft 文档中明确提到了这一点:docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sqlWhen you use TOP with the ORDER BY clause, the result set is limited to the first N number of ordered rows. Otherwise, TOP returns the first N number of rows in an undefined order.
【解决方案2】:

在派生表中执行TOP 10,然后对其结果使用MAX。比如:

select max(dt.col1)
from
(
  select top 10 col1
  from table 
  where ...
  order by ...
) dt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多