首页 > 解决方案 > 按最近日期加入的聚合函数 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

我不确定如何写这个只选择最高分(或只选择最近日期的分数)

感谢您的指导。

标签: oracledatejoinaggregategreatest-n-per-group

解决方案


要选择最高分数,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

推荐阅读