SQL选择列的总和最大的行(在GROUP BY中有两个字段)

Posted

技术标签:

【中文标题】SQL选择列的总和最大的行(在GROUP BY中有两个字段)【英文标题】:SQL select row where SUM of a column is greatest (with two fields in GROUP BY) 【发布时间】:2015-05-01 17:23:19 【问题描述】:

这是我的基本查询(SQL Server):

SELECT projectID, businessID, sum(number) AS summ
FROM table
GROUP BY projectID, businessID
ORDER BY projectID, sum(number) DESC

生成这样的表格:

         Project ID      Business ID    Summ
              1              1           63
              1              2           32 
              1              3            6
              2              3           45
              2              1           44
              2              2            3

我想获取每个项目 ID 的 Summ 列最大的项目 ID 和业务 ID。所以给出的示例中的第 1 行和第 4 行。我如何调整原始查询来做到这一点?

【问题讨论】:

什么关系型数据库? SQL 服务器? mysql?甲骨文? Postgres? 您只想要与 sum 列对应的值最大的一行? 丹,SQL Server。 Mayank,我想要每个项目 ID 的总和列最大的每一行。 请检查:dba.stackexchange.com/questions/6368/… 如果您要尝试回答问题,请发布答案。您的评论没有帮助。 【参考方案1】:

如果您可能有平局并想要返回两行,您应该使用:

select * from
    (select projectID, businessID
      , sum(number) as Tot
      , max(sum(number)) over (partition by projectID) as MSum
      from Table
    group by projectID, businessID)
a
where a.tot = a.Msum

【讨论】:

你可以计算一个聚合函数的结果的解析函数吗?你可以这样做是有道理的,但我不知道。酷。【参考方案2】:

您可以使用分析函数:

SELECT projectID,
       businessID,
       summ
  FROM(SELECT projectID,
              businessID,
              SUM(number) AS summ,
              ROW_NUMBER() OVER (PARTITION BY projectID
                                     ORDER BY SUM(number) DESC) AS rn
        FROM table
       GROUP
          BY projectID,
             businessID
      ) t
 WHERE rn = 1
 ORDER
    BY projectID;

希望对您有所帮助。

【讨论】:

这将返回原始查询所做的每一行,并带有一个新列 rn,每行的值为 1。 原帖有一个小错误。你能再试一次吗。这是一个 sqlfiddle 示例sqlfiddle.com/#!6/887d2/7 就是这样!按 projectID 和 businessID 进行分区是问题所在。谢谢!【参考方案3】:

您需要第二个聚合或分析函数。这是一种使用第二个聚合的方法:

WITH sums as (
  SELECT projectID, businessID, sum(number) AS summ
  FROM table
  GROUP BY projectID, businessID
)
SELECT sums.projectId, sums.businessId, sums.summ
FROM
  (
    SELECT projectID, MAX(summ) as ms
    FROM sums
    GROUP BY projectID
  ) ms
  JOIN sums
    ON sums.projectId = ms.projectId AND sums.summ = ms.ms

在不支持分析函数的系统上需要这种方法,幸运的是,它不包括 SQL Server。

【讨论】:

以上是关于SQL选择列的总和最大的行(在GROUP BY中有两个字段)的主要内容,如果未能解决你的问题,请参考以下文章

SQL group by:选择另一列有其最小值/最大值的值

使用 group_by 将两个不同表列的总和获取到单个列

在 SQL 中选择不在 Group By 中的列

Oracle SQL查询到GROUP BY并减去?

通过 group by 和 joins 获取多个表的多个列的总和

从 GROUP BY 中获取具有 NULL 列的行