【问题标题】:Limit Max and Group by returned too many rows限制 Max 和 Group by 返回太多行
【发布时间】:2017-10-29 02:20:20
【问题描述】:

我正在使用 SQL Server 数据库。

鉴于以下查询,我试图获得每个班级的最高分。 Scores 表有 50 行用于两个类,所以我想要总共 2 行。但是,因为我有Scores.Id,它返回Scores 的每一行,因为Scores.Id 是唯一的。当然,简单的解决方案是删除 Scores.Id 列,除非我需要知道 Scores.Id 才能进行额外的查找。

SELECT 
    Class_Id, Scores.Id, MAX(Scores.ClassScore) AS Score
FROM  
    Classes 
INNER JOIN
    Scores ON Classes.Id = Scores.Class_Id                
GROUP BY 
    Scores.Class_Id, Scores.Id

【问题讨论】:

    标签: sql sql-server select


    【解决方案1】:

    class_id 的最高分很简单

    select class_id, max(classScore) score from scores
    group by class_id
    

    如果您随后需要知道分数表中的哪些行具有最高分数,您可以进行联接。如果每个班级有一个以上相等的最高分数,您可能会得到超过两行。

    select id, class_id, classscore from
    scores s
    inner join
    (
        select class_id, max(classScore) score from scores
        group by class_id
    )
    t
    on t.class_id = s.class_id and t.score = s.classScore
    

    或者我可能会使用 cte

    with maxScores as
    (
        select class_id, max(classScore) score from scores
        group by class_id
    )
    select id, class_id, classscore from
    scores s
    on maxScores.class_id = s.class_id and maxScores.score = s.classScore
    

    【讨论】:

    • 其他两个答案都是有效的。有趣的是(对于非常少量的测试数据)我的查询给出了最简洁的查询计划,但是 RANK 函数给出了最快的查询(在添加索引之后)。
    【解决方案2】:

    这是你想要的吗?

    select s.*
    from (select s.*,
                 max(s.classscore) over (partition by s.class_id) as max_classscore
          from scores s
         ) s
    where classscore = max_classscore;
    

    鉴于您想要的信息,加入Classes 是多余的。

    【讨论】:

      【解决方案3】:

      这看起来像是 rank 窗口函数的工作:

      SELECT Class_Id, Id, Score
      FROM   (SELECT Class_Id, Scores.Id AS Id, Score, 
                     RANK() OVER (PARTITION BY Class_Id, Scores.Id
                                  ORDER BY Score DESC) AS rk
              FROM   Classes 
              JOIN   Scores ON Classes.Id = Scores.Class_Id) t
      WHERE  rk = 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-07
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 2012-10-30
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多