【问题标题】:aggregate function with join by most recent date Oracle按最近日期加入的聚合函数 Oracle
【发布时间】:2019-09-12 15:55:17
【问题描述】:

我正在尝试按考试类型、考试元素、学期和 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。我只是想让例程的这个小子集生成正确数量的唯一记录

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

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

感谢您的指导。

【问题讨论】:

    标签: oracle date join aggregate greatest-n-per-group


    【解决方案1】:

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

    【讨论】:

    • 太棒了,谢谢!!从 Group By 中删除 score 字段消除了不需要的行!
    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 2019-08-16
    • 2018-04-16
    • 2013-06-06
    • 2022-01-23
    • 1970-01-01
    • 2015-02-02
    • 2012-10-27
    相关资源
    最近更新 更多