【发布时间】:2021-01-20 15:51:44
【问题描述】:
我正在尝试使用学生竞赛的结果更新 SQL 表。对于那场比赛,我有 2 个表格:参与者(姓名、班级、学校等)和结果(participant_id、结果和主题)。现在我需要根据每个参与者的结果给每个参与者一个状态——第一名、第二名或第三名。
棘手的部分是比赛的规则。每个参与者都必须在各自的学校和班级中获得此身份。所以我必须在每个学校和每个班级都有获奖者。用第 2 名和第 3 名来更新表格非常简单,因为它们被视为 result >= 50 并且 result
我尝试了很多与 MAX() 语句的组合,但没有成功。无论我尝试什么,我都无法根据 2 个条件(学校中的最大值,课堂上的最大值)显示最大值。我需要 Excel 中的 =MAXIFS() 之类的东西,但不知道如何在 SQL 中执行。
UPD。例子
表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 |
表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 |
基本上,每个学校和班级的第 1 名是 MAX,第 2 名小于 MAX 并且 >= 50,第 3 名刚好小于 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
我也尝试过使用子查询,但显然没有帮助 - 不同的子查询甚至给出不同的行数,或者生成的“状态”与分数和其他信息不匹配。
【问题讨论】:
-
您能否为您的输入数据创建Minimal, Reproducible Example 以及您希望为该示例数据获得什么结果?
-
请提供表格架构、示例数据和预期结果
-
并显示您尝试过的无效
-
查询中为什么会出现参与者表?
-
请学习如何使用
GROUP BY。您的查询无效。