sql - 从与另一列的最大值关联的列中返回一个值
问题描述
抱歉标题令人困惑,但我不知道如何表达我的问题。
我有一个查询,它返回一个测试分数表,以及测试本身的一些描述:
+----------------+------------+-----------+
| student_id | test_score | test_term |
+----------------+------------+-----------+
| 1 123 | 614 | Spring |
| 2 123 | 547 | Summer |
| 3 123 | 628 | Fall |
+----------------+------------+-----------+
如您所见,学生 123 参加了 3 次数学考试。我正在尝试编写一个查询,该查询将返回学生 123 取得的最高分数,以及与该分数相关的测试术语。这是我到目前为止所拥有的:
SELECT
MAX (test_score) as "highest_math_score",
CASE WHEN test_score = MAX(test_score) THEN test_term
ELSE null
END as "highest_test_term"
FROM Table1
GROUP BY
student_id
但是,我收到错误:not a GROUP BY expression.
关于如何做到这一点的任何想法?
解决方案
您可以使用MAX..KEEP
:
SELECT student_id,
max(test_score),
max(test_term) KEEP ( DENSE_RANK FIRST ORDER BY test_score desc )
FROM test_data
GROUP BY student_id;
完整示例:
WITH test_data ( student_id, test_score, test_term ) AS
( SELECT 123, 614, 'Spring' FROM DUAL UNION ALL
SELECT 123, 547, 'Summer' FROM DUAL UNION ALL
SELECT 123, 628, 'Fall' FROM DUAL UNION ALL
SELECT 456, 999, 'Spring' FROM DUAL UNION ALL
SELECT 456, 1111, 'Summer' FROM DUAL UNION ALL
SELECT 456, 888, 'Fall' FROM DUAL )
SELECT student_id, max(test_score), max(test_term) KEEP ( DENSE_RANK FIRST ORDER BY test_score desc )
FROM test_data
GROUP BY student_id;
+------------+-----------------+--------+ | STUDENT_ID | MAX(TEST_SCORE) | TERM | +------------+-----------------+--------+ | 123 | 628 | Fall | | 456 | 1111 | Summer | +------------+-----------------+--------+
推荐阅读
- powershell - 使用 powershell 创建计划任务时无法传递参数。我应该将 -version 设为“sql server 2016”而不是“sql”
- r - 为 R 中的一个特征变量生成平滑样条曲线
- android - Android - 每隔几秒可靠地 ping 服务器
- python - 具有已建立范围的第一个值的新列
- excel - 调用 MS 项目任务的唯一 ID 时出现 Excel VBA 错误
- php - 如何匹配字符串中的所有字符并收集多个组?
- exchange-server - 电子邮件收件箱文件夹中 UID 的最大值是多少?
- python - 如何创建一个脚本来逐行读取文件并将它们连接成一个字符串?(Python 或 Bash)
- regex - React Native 中的美元格式正则表达式
- hive - 如何快速获取 150 多个表的最近十天分区计数