MySQL 具有 2 个条件的最大值
MySQL MAX value with 2 conditions
我正在尝试用学生竞赛的结果更新 SQL table。对于那场比赛,我有 2 tables:参与者(姓名、class、学校等)和结果(participant_id、结果和主题)。现在我需要根据他们的结果给每个参与者一个状态——第一名、第二名或第三名。
棘手的部分是那场比赛的规则。每个参与者都必须在各自的学校和 class 获得此身份。所以我必须在每个学校和每个 class 中都有获胜者。用第 2 名和第 3 名更新 table 非常简单,因为它们被计算为结果 >= 50 和结果 < 50。但是第 1 名必须是这个学校和这个 class 中的最高分。
我尝试了很多与 MAX() 语句的组合,但没有成功。无论我尝试什么,我都无法让它根据 2 个条件显示最大值(学校最大值,class 最大值)。我需要 Excel 中的 =MAXIFS() 之类的东西,但不知道如何在 SQL 中使用它。
更新。例子
Table participants
| id | name | class | school |
------------------------------
| 01 | John | 10 | 312 |
| 02 | Jack | 10 | 312 |
| 03 | Mary | 11 | 144 |
| 04 | Dany | 11 | 312 |
| 05 | Mark | 7 | 144 |
Table results
| id | participant_id | subject | score |
-----------------------------------------
| 01 | 03 | 4 | 55 |
| 02 | 01 | 4 | 75 |
| 03 | 04 | 4 | 60 |
| 04 | 05 | 4 | 45 |
| 05 | 02 | 4 | 90 |
我需要的结果必须是这样的:
| id | participant_id | subject | score | status |
-----------------------------------------------------
| 01 | 03 | 4 | 55 | 1st place |
| 02 | 01 | 4 | 75 | 2nd place |
| 03 | 04 | 4 | 60 | 3rd place |
| 04 | 05 | 4 | 45 | 3rd place |
| 05 | 02 | 4 | 90 | 1st place |
基本上每个学校的第一名都是MAX class,第二名小于MAX且>=50,第三名刚好小于50。
无法显示我尝试的所有内容,因为它是同一查询的所有变体。类似的东西:
SELECT
id, participant_id, subject, score,
(CASE
WHEN score >= 50 THEN '2nd place'
WHEN score < 50 THEN '3rd place'
WHEN score = MAX(score) THEN '1st place'
END) AS 'status'
FROM results
INNER JOIN participants ON results.participant_id = participants.id
GROUP BY participant_id
我也尝试过子查询,但显然没有帮助 - 不同的子查询甚至给出不同的行数或结果 'status' 与分数和其他信息不匹配。
下一个查询可以作为解决方案:
SELECT
participants.*,
results.*,
(CASE
WHEN score = max_score THEN '1st place'
WHEN score >= 50 THEN '2nd place'
WHEN score < 50 THEN '3rd place'
END) AS 'status'
FROM participants
JOIN results ON results.participant_id = participants.id
JOIN (
SELECT
class, school, max(score) max_score
FROM results
INNER JOIN participants ON results.participant_id = participants.id
GROUP BY class, school
) max_results ON
max_results.class = participants.class AND
max_results.school = participants.school;
这里是 fiddle:SQLize.online
我正在尝试用学生竞赛的结果更新 SQL table。对于那场比赛,我有 2 tables:参与者(姓名、class、学校等)和结果(participant_id、结果和主题)。现在我需要根据他们的结果给每个参与者一个状态——第一名、第二名或第三名。
棘手的部分是那场比赛的规则。每个参与者都必须在各自的学校和 class 获得此身份。所以我必须在每个学校和每个 class 中都有获胜者。用第 2 名和第 3 名更新 table 非常简单,因为它们被计算为结果 >= 50 和结果 < 50。但是第 1 名必须是这个学校和这个 class 中的最高分。
我尝试了很多与 MAX() 语句的组合,但没有成功。无论我尝试什么,我都无法让它根据 2 个条件显示最大值(学校最大值,class 最大值)。我需要 Excel 中的 =MAXIFS() 之类的东西,但不知道如何在 SQL 中使用它。
更新。例子
Table participants
| id | name | class | school |
------------------------------
| 01 | John | 10 | 312 |
| 02 | Jack | 10 | 312 |
| 03 | Mary | 11 | 144 |
| 04 | Dany | 11 | 312 |
| 05 | Mark | 7 | 144 |
Table results
| id | participant_id | subject | score |
-----------------------------------------
| 01 | 03 | 4 | 55 |
| 02 | 01 | 4 | 75 |
| 03 | 04 | 4 | 60 |
| 04 | 05 | 4 | 45 |
| 05 | 02 | 4 | 90 |
我需要的结果必须是这样的:
| id | participant_id | subject | score | status |
-----------------------------------------------------
| 01 | 03 | 4 | 55 | 1st place |
| 02 | 01 | 4 | 75 | 2nd place |
| 03 | 04 | 4 | 60 | 3rd place |
| 04 | 05 | 4 | 45 | 3rd place |
| 05 | 02 | 4 | 90 | 1st place |
基本上每个学校的第一名都是MAX class,第二名小于MAX且>=50,第三名刚好小于50。
无法显示我尝试的所有内容,因为它是同一查询的所有变体。类似的东西:
SELECT
id, participant_id, subject, score,
(CASE
WHEN score >= 50 THEN '2nd place'
WHEN score < 50 THEN '3rd place'
WHEN score = MAX(score) THEN '1st place'
END) AS 'status'
FROM results
INNER JOIN participants ON results.participant_id = participants.id
GROUP BY participant_id
我也尝试过子查询,但显然没有帮助 - 不同的子查询甚至给出不同的行数或结果 'status' 与分数和其他信息不匹配。
下一个查询可以作为解决方案:
SELECT
participants.*,
results.*,
(CASE
WHEN score = max_score THEN '1st place'
WHEN score >= 50 THEN '2nd place'
WHEN score < 50 THEN '3rd place'
END) AS 'status'
FROM participants
JOIN results ON results.participant_id = participants.id
JOIN (
SELECT
class, school, max(score) max_score
FROM results
INNER JOIN participants ON results.participant_id = participants.id
GROUP BY class, school
) max_results ON
max_results.class = participants.class AND
max_results.school = participants.school;
这里是 fiddle:SQLize.online