【问题标题】:SQL find SUM of MAX valuesSQL 查找 MAX 值的总和
【发布时间】: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'....这样的子查询。
  • 尝试自己编写一些东西,如果不起作用,请具体向我们展示您所做的事情,以便我们为您提供帮助。您启动它,然后我们提供帮助。我们不是为你写的。向我们展示您尝试过的实际代码,然后描述发生的事情和不正确的事情,然后我们可以从那里帮助您。如果您先自己尝试一下,您可能会非常接近答案。

标签: sql


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2018-07-27
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多