【问题标题】:SQL: When records are equal in two fields, select only one based on a third fieldSQL:当两个字段的记录相等时,根据第三个字段只选择一个
【发布时间】:2015-09-15 01:36:01
【问题描述】:

一个 SQL 查询:假设我有一个类似的表

Student Module Mark OtherField
1       A      23   6
1       A      40   12
2       B      76   6
2       C      87   7

(这个想法是学生可以多次重修学校模块) 我只想为每个模块选择最高分,即输出

Student Module Mark OtherField
1       A      40   12
2       B      76   6
2       C      87   7

即:当“Student”和“Module”两个或多个记录相等时,如何选择“Mark”值最高的记录?

【问题讨论】:

  • MS Access/MS SQL Server/MySQL 还是一切?
  • 所以我想这是一个一般的SQL问题(?)在GUI界面中看不到怎么做。
  • 如果学生两次获得最高分怎么办?是否应该返回 otherfield 的两个值?只有一个?如果有,是哪一个?

标签: sql ms-access


【解决方案1】:
SELECT
  table.student,
  table.module,
  max(table.Mark) highestMark
FROM
  table
GROUP BY
  table.module,
  table.student

【讨论】:

  • 但是我怎样才能显示OtherField?
  • 您可以将它包含在您的选择中吗? @ASV
  • @edrodriguez 我认为,这仅在 MySQL 中允许; MS Access 不支持。您只能选择按列表分组的那些没有聚合的列。
  • 不是同一张表中的其他字段吗? @DeepakPawar
  • 我对这个问题的解释是,您希望每个学生每个模块的最高分。我不知道您在选择中需要 OtherField。如果我误解了,请道歉。
【解决方案2】:

我不确定 MS Access 中使用的语法,但您似乎只会使用以下内容:

选择不同的学生 , 模块 , 最大(标记) , 其他领域 FROM tbl_example 按学生分组 , 模块 , 其他领域

你明白了....

【讨论】:

    【解决方案3】:

    我认为这就是您正在寻找的,代码方面:

    select
        student,
        module,
        mark,
        otherfield
    from
        your_table as a
    where
        mark = (select max(mark) from your_table as b where a.student = b.student and a.module = b.module);
    

    但是,您的逻辑有缺陷。如果一个学生的高分(例如 85 分)并且两次获得该分数会怎样?是否应该返回 otherfield 的两个值?只有一个?哪一个?

    【讨论】:

    • 感谢您的回答@John。碰巧的是,OtherField 基本上是独一无二的,所以重复不是问题。再次感谢!
    • 对于它的价值,我不担心otherfield的重复,我担心mark的重复......这保证是唯一的吗?
    【解决方案4】:

    怎么样:

    SELECT
        t.Student,
        t.Module,
        MAX(t.Mark) AS Highest_Mark
    FROM _your_student_table t
    GROUP BY t.Student, t.Module
    

    如果您需要 OtherField(感谢@Deepak Pawar 的提示),那么:

    SELECT
        x.Student,
        x.Module,
        x.Highest_Mark,
        y.OtherField
    FROM
    (
        SELECT
            t.Student,
            t.Module,
            MAX(t.Mark) AS Highest_Mark
        FROM _your_student_table_ t
        GROUP BY t.Student, t.Module
    ) x
    INNER JOIN _your_student_table_ y
      ON x.Student = y.Student AND x.Module = y.Module AND x.Highest_Mark = y.Mark
    

    【讨论】:

    • 这不会选择其他字段。
    • 抱歉,刚刚看到,它是用于 MS Access 的。在这种情况下,需要 INNER JOIN。否则它应该可以工作。
    • 非常感谢!。太棒了。唉,我的 +1 似乎太新了,但请接受我的感谢!
    猜你喜欢
    • 2021-07-13
    • 2020-06-03
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多