【问题标题】:How to output only one max value from this query in SQL?如何在 SQL 中从这个查询中只输出一个最大值?
【发布时间】:2010-06-29 12:40:11
【问题描述】:

昨天Thomas 通过提供exactly the query I wanted 帮助了我很多。现在我需要它的一个变种,希望有人能帮助我。

我希望它只输出一行,即最大值 - 但它必须基于以下查询中的算法:

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
                                          UNION ALL
                                          SELECT     DATEADD(d, 1, Date) AS Expr1
                                          FROM         Calendar AS Calendar_1
                                          WHERE     (DATEADD(d, 1, Date) < @EndDate))
    SELECT     C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
     FROM         Calendar AS C CROSS JOIN
                            Country AS C2 LEFT OUTER JOIN
                            Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
     WHERE     (C2.Country = @Country)
     GROUP BY C.Date, C2.Country OPTION (MAXRECURSION 0)

上面的输出会是这样的:

Date            Country         Allocated testers
06/01/2010      Chile             3
06/02/2010      Chile             4
06/03/2010      Chile             0
06/04/2010      Chile             0
06/05/2010      Chile            19

但我现在需要的是

Allocated testers
           19

即 - 只有一列 - 一行 - 最大值本身...(对于(通过参数(已存在))选定的日期和国家期间)

【问题讨论】:

  • 在您的示例结果中需要的人员应该是分配的测试人员,对吗?

标签: sql visual-studio-2008 sql-server-2005


【解决方案1】:

使用orderlimit

ORDER BY 'people needed DESC' LIMIT 1 

编辑

因为 LIMIT 在 sql 中不存在

使用ORDER BYTOP

select TOP 1 .... ORDER BY 'people needed' DESC

【讨论】:

  • LIMIT 在 SQL Server 中不存在。我相信你在谈论 MySQL。
  • SELECT TOP 1 ... 将是 SQL 服务器的等效项 ..(最后加上 ORDER BY [people needed] DESC
  • 我猜你的意思是我应该按照 MaasSql 的建议把它放到上下文中?好吧,由于某种原因,我无法让它滚动...... :-(
【解决方案2】:
WITH  Calendar
        AS (
             SELECT
              CAST(@StartDate AS datetime) AS Date
             UNION ALL
             SELECT
              DATEADD(d, 1, Date) AS Expr1
             FROM
              Calendar AS Calendar_1
             WHERE
              ( DATEADD(d, 1, Date) < @EndDate )
           )
SELECT TOP 1 *
FROM 
(           
  SELECT
    C.Date
   ,C2.Country
   ,COALESCE(SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
  FROM
    Calendar AS C
    CROSS JOIN Country AS C2
    LEFT OUTER JOIN Requests AS R
      ON C.Date BETWEEN R.[Start date] AND R.[End date]
         AND R.CountryID = C2.CountryID
  WHERE
    ( C2.Country = @Country )
  GROUP BY
    C.Date
   ,C2.Country
OPTION
    ( MAXRECURSION 0 )
    ) lst
    ORDER BY lst.[Allocated testers] DESC

【讨论】:

  • 看起来很不错,但这是我的 VS Studio 在将其放入查询生成器时告诉我的:“GROUP BY 子句中的错误。无法解析查询文本。”
  • 嘿,它有效!您要做的就是将“ OPTION (MAXRECURSION 0)” 作为绝对最后一个命令 :-) 非常感谢!
【解决方案3】:

@Salil 回答中讨论的完整示例..

WITH Calendar AS (SELECT     CAST(@StartDate AS datetime) AS Date
                  UNION ALL
                  SELECT     DATEADD(d, 1, Date) AS Expr1
                  FROM         Calendar AS Calendar_1
                   WHERE     (DATEADD(d, 1, Date) < @EndDate))
SELECT  TOP 1   C.Date, C2.Country, COALESCE (SUM(R.[Amount of people per day needed]), 0) AS [Allocated testers]
FROM    Calendar AS C CROSS JOIN
        Country AS C2 LEFT OUTER JOIN
        Requests AS R ON C.Date BETWEEN R.[Start date] AND R.[End date] AND R.CountryID = C2.CountryID
WHERE     (C2.Country = @Country)
GROUP BY C.Date, C2.Country 
ORDER BY 3 DESC
OPTION (MAXRECURSION 0)

ORDER BY 3 表示按SELECT 语句中的第三个字段排序。因此,如果您删除前两个字段,请相应地进行更改。

【讨论】:

  • 非常好,谢谢!即使不久前我得到了另一个有效的答案,我也会检查一下 - 以及关于 ORDER BY 3 的好信息。不知道 :-)
  • 所以我猜“SELECT TOP...”和“ORDER BY ... DESC”总是要粘在一起? ((另外,)我喜欢不需要额外的括号(在你的解决方案中))
猜你喜欢
  • 2018-10-21
  • 1970-01-01
  • 2014-12-27
  • 2015-02-03
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
相关资源
最近更新 更多