oracle - 按最近日期加入的聚合函数 Oracle
问题描述
我正在尝试按测试类型、测试元素、学期和 ID 为学生选择一个测试分数。每个 ID 一个分数。如果学生多次参加测试,我只想返回该测试和元素的最高(或最近)分数。
我的问题是,在极少数情况下(2000 年不到 10 条记录),学生在不同日期记录了两个考试成绩,因为他们重新参加了考试以提高他们的分数,我们记录了两个分数. 因此,我的输出有少量记录,其中包含唯一 name_ids 的多个分数(其中 test_id = 'act' 和 element_id = 'comp')。
这两个表的示例是:
students
----------------------------------------------------------
name_id term_id
100 Fall
100 Spring
100 Summer
105 Fall
105 Spring
110 Fall
110 Spring
110 Summer
test_score
----------------------------------------------------------
name_id test_id element_id score test_date
100 act comp 25 02/01/2019
100 sat comp 1250 01/20/2019
105 act comp 19 01/15/2019
105 act comp 21 02/28/2019
110 act comp 27 01/31/2019
我试过使用 MAX(test_score) 但也许可以使用 MAX(test_date)?任何一种方法都行得通,因为如果分数不高于最初报告的分数,学生不会报告以后的额外考试分数。
这是连接多个表的较大例程的一小部分,所以我不知道我可以替换我的 JOIN(s)。我只是想让这个例程的一小部分产生正确数量的唯一记录
SELECT
a.name_id NameID,
a.term_id TermID,
MAX(b.score) Score
FROM students a
LEFT JOIN test_score b ON a.name_id = b.name_id AND b.test_id = 'act' AND b.element_id = 'comp'
WHERE a.term_id = 'Spring'
group by b.score,a.name_id,a.term_id
order by a.name_id
没有错误消息,但上面的结果将为 NameID 105 生成两条记录:
NameID TermID Score
100 Spring 25
105 Spring 19
105 Spring 21
110 Spring 27
我不确定如何写这个只选择最高分(或只选择最近日期的分数)
感谢您的指导。
解决方案
要选择最高分数,GROUP BY 不能包含分数...
SELECT
a.name_id NameID,
a.term_id TermID,
MAX(b.score) Score
FROM students a
LEFT JOIN test_score b ON a.name_id = b.name_id AND b.test_id = 'act' AND b.element_id = 'comp'
WHERE a.term_id = 'Spring'
group by a.name_id,a.term_id
order by a.name_id
要获得与最高日期相关的分数...
SELECT x.NameID,
x.TermID,
y.score
FROM (
SELECT
a.name_id NameID,
a.term_id TermID,
--- MAX(b.score) Score
MAX(b.test_date) test_date
FROM students a
LEFT JOIN test_score b ON a.name_id = b.name_id AND b.test_id = 'act' AND b.element_id = 'comp'
WHERE a.term_id = 'Spring'
group by a.name_id,a.term_id ) x
LEFT JOIN test_score y ON x.nameid = y.name_id AND x.test_date = y.test_date
order by x.nameid
推荐阅读
- postgresql - regexp_replace 仅捕获第一个实例
- python - 有没有办法删除 Tkinter 上的退出按钮?
- x86 - 读取当前非核心频率并设置非核心频率倍数
- regex - 正则表达式前瞻匹配关键字并排除特定模式
- java - Java If (conditions) are NOT TRUE 抛出异常的语法
- python-asyncio - 有什么方法可以将 FastAPI 处理程序的输入参数限制为几个指定的选项?
- python - 使用来自 tkinter 的 askopenfile() 的输入创建一个列表
- python - request.post 变量总是返回为空
- javascript - 从 react-bootstrap-table-next 路由到新组件?
- reactjs - 使用 AWS Cognito 用户处理函数时如何设置状态