SQL 查找 MAX 值的总和

Posted

技术标签:

【中文标题】SQL 查找 MAX 值的总和【英文标题】:SQL find SUM of MAX values 【发布时间】:2021-12-29 16:54:49 【问题描述】:

我是 SQL 新手,正在为这个查询苦苦挣扎,非常感谢任何帮助。

我的桌子是这样的:

id score level
2 250 1
2 350 1
2 850 2
2 260 2
2 750 3
2 560 3

我想计算一个总分作为每个级别的最高分。

所以通俗地说:总分 = 第 1 级的最高分数 + 第 2 级的最高分数 + 第 3 级的最高分数

如何在 SQL 中复制它?

【问题讨论】:

到目前为止你尝试了什么? 请标记数据库平台 GROUP BY,然后对其结果求和。 我认为你使用了像SELECT *, (SELECT SUM(table.score) WHERE level = N) AS 'level_1_score'....这样的子查询。 尝试自己编写一些东西,如果不起作用,请具体向我们展示您所做的事情,以便我们为您提供帮助。您启动它,然后我们提供帮助。我们不是为你写的。向我们展示您尝试过的实际代码,然后描述发生的事情和不正确的事情,然后我们可以从那里帮助您。如果您先自己尝试一下,您可能会非常接近答案。 【参考方案1】:

您可以在子查询的结果上使用SUM

SELECT
   SUM(max_score) AS total_score 
FROM
   (
      SELECT
         MAX(score) AS max_score 
      FROM
         YOUR_TABLE_NAME 
      GROUP BY
         level
   )
   AS max_scores

【讨论】:

这很好用,感谢 Sash,非常感谢您的帮助。现在我也会尝试按 user_id 分组:) 没问题,乐于助人。【参考方案2】:
select distinct sum(max(score)) over () as "Total Score" from T group by level;

您可以将这两个聚合与group by 一起进行,然后进行窗口总和。 Distinct 负责删除每个组重复的相同总和。 (总的来说,我会鼓励你避免过度依赖select distinct。)

使用 CTE/派生表的其他方法非常好。初学者的解决方案可能看起来更像这样:

select t.level, sum(maxScore) as "Total Score"
from T t inner join
    (select level, max(score) as maxScore from T group by level) as m
        on m.level = t.level
group by t.level;

根据平台,您可能会得到它的工作

select level,
    sum((select max(score) from t t2 where t2.level = t.level)) as "Total Score"
from T t
group by level

【讨论】:

【参考方案3】:

您好,我认为您正在寻找此解决方案。我希望它能解决你的问题。

WITH A as (
Select MAX(score) as "MAX order" FROM "YOUR TABLE" GROUP BY level)
SELECT SUM("MAX score per level") FROM a

【讨论】:

以上是关于SQL 查找 MAX 值的总和的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用反应在表中查找检查值的总和

查找两个总和为特定值的索引

试图在嵌套字典中查找唯一值的总和。 (见例子!)

在PHP中查找总和的最接近值的算法

查找总和等于 k ​​的子集的数量

使用 GROUP BY 后查找具有 MAX 值的行