【问题标题】:SQL MAX statementSQL MAX 语句
【发布时间】:2016-01-24 05:38:13
【问题描述】:

我会更好地描述我的问题,并且我想包含我的数据。

我需要 6 个表中的数据:

学生 存储等级 sg 测试 测试分数 ts 学生测试 StudentTestScore sts

这就是我正在尝试做的事情。我需要一份我可以运行的报告,该报告将显示学生上个学期最近获得的成绩以及他们在 HS 职业生涯中的最佳 PSAT 考试成绩。

学生

ID  Student_Number  lastfirst   grade_level
1   1   Bird, Big   9
2   2   Bob, Sponge 10
3   3   Man, He 9
4   4   Rah, She    10
5   5   Myers, Michael  11

StoredGrades SG (我需要收集课程名称和编号以及教师姓名和他们获得的成绩)

course_name Course_number   Grade   Teacher_name    StudentID
Foundations of Catholic Worldview Honors    THE409  A+  Mr. M   1
US Government Honors    SOC405  A   Mrs. H  1
US Government Honors    SOC405  B-  Mr. H   1
Social Justice  THE404  A   Mrs. C  2
Psychology Honors   SOC605  A-  Mrs. E  2
Forensics   SCI334  A   Mrs. R  2
Social Justice  THE404  A+  Mr. H   3
US Government Honors    SOC405  B   Mrs. C  3
Peace and Justice I Honors  THE407  A+  Mrs. E  3
Peace and Justice I THE406  A-  Mrs. R  4
Peace and Justice I THE406  A+  Mrs. E  4
Economics Honors    SOC415  A-  Mrs. R  4
Peace and Justice I THE406  A-  Mr. H   4
US Government   SOC400  A+  Mr. L   5
Peace and Justice I Honors  THE407  A+  Mr. B   5
Social Justice Honors   THE405  A+  Mrs. C  5

测试分数来自 4 个表格:

测试 (给我们表的名称)

ID  Name
3   PSAT

TestScores ts (告诉我们测试需要哪些子分数)

ID  Name    TestID
51  PSAT_Critical Reading   3
53  PSAT_Math   3

StudentTest st (告诉我们学生参加的考试、考试日期以及学生参加考试的次数)

ID StudentID TestID Test_Date 658 1 3 2015 年 12 月 1 日 998 2 3 2015 年 12 月 1 日 100 2 3 2016 年 12 月 1 日 1354 3 3 2014 年 12 月 1 日 1500 3 3 2015 年 12 月 1 日 1688 3 3 2016 年 12 月 1 日 8875 4 3 2015 年 12 月 1 日 3364 5 3 2015 年 12 月 1 日

StudentTestScore sts (告诉我们学生在考试中的得分情况。例如,Big Bird 在他的批判性阅读 PSAT 考试中获得了 78%。)

ID  NumScore    StudentID   StudentTestID   TestScoreID
573 78  1   658 51
574 65  1   658 53
385 62  2   998 51
387 68  2   998 53
889 89  2   100 51
892 92  2   100 53
112 58  3   1354    51
113 59  3   1354    53
6544    68  3   1688    51
6546    62  3   1688    53
8882    75  3   1500    51
8889    79  3   1500    53
425 98  4   8875    51
426 97  4   8875    53
658 82  5   3364    51
659 86  5   3364    53

这就是我想要的:

ID  Student_Number  lastfirst   grade_level Teacher_name    course_name Course_number   Grade   Test Date   Test Name   Best PSAT Reading Score Best PSAT Math Score
1   1   Bird, Big   9   Mr. M   Foundations of Catholic Worldview Honors    THE409  A+  12/1/2015   PSAT    78  65
1   1   Bird, Big   9   Mrs. H  US Government Honors    SOC405  A   12/1/2015   PSAT    78  65
1   1   Bird, Big   9   Mr. H   US Government Honors    SOC405  B-  12/1/2015   PSAT    78  65
2   2   Bob, Sponge 10  Mrs. C  Social Justice  THE404  A   12/1/2016   PSAT    89  92
2   2   Bob, Sponge 10  Mrs. E  Psychology Honors   SOC605  A-  12/1/2016   PSAT    89  92
2   2   Bob, Sponge 10  Mrs. R  Forensics   SCI334  A   12/1/2016   PSAT    89  92
3   3   Man, He 9   Mr. H   Social Justice  THE404  A+  12/1/2015   PSAT    75  79
3   3   Man, He 9   Mrs. C  US Government Honors    SOC405  B   12/1/2015   PSAT    75  79
3   3   Man, He 9   Mrs. E  Peace and Justice I Honors  THE407  A+  12/1/2015   PSAT    75  79
4   4   Rah, She    10  Mrs. R  Economics Honors    SOC415  A-  12/1/2015   PSAT    98  97
4   4   Rah, She    10  Mr. H   Peace and Justice I THE406  A-  12/1/2015   PSAT    98  97
5   5   Myers, Michael  11  Mr. L   US Government   SOC400  A+  12/1/2015   PSAT    82  86
5   5   Myers, Michael  11  Mr. B   Peace and Justice I Honors  THE407  A+  12/1/2015   PSAT    82  86
5   5   Myers, Michael  11  Mrs. C  Social Justice Honors   THE405  A+  12/1/2015   PSAT    82  86

我得到的是这样的:

ID  Student_Number  lastfirst   grade_level Teacher_name    course_name Course_number   Grade   Test Date   Test Name   Best PSAT Reading Score Best PSAT Math Score
4   4   Rah, She    10  Mrs. R  Economics Honors    SOC415  A-  12/1/2015   PSAT    98  97
4   4   Rah, She    10  Mr. H   Peace and Justice I THE406  A-  12/1/2015   PSAT    98  97

学生 ID 为 4,因为他们有最好的测试结果。我需要每个人的个人最佳测试结果。

感谢您能给我的任何帮助!

【问题讨论】:

    标签: sql oracle top-n


    【解决方案1】:

    您尚未提供任何示例数据,因此以下是推论。

    您的查询返回了许多无关的列,例如教师姓名和课程,这意味着您会为每个学生获得多行。

    您的查询似乎包括参数化学生 ID 上的联接,这可能是您只获取一个学生的行的原因。

    此查询使用分析 RANK() 函数来确定每个学生和子测试的最高分数。

    SELECT StuNumber
            , StuName
            , GradeLevel
            , test_name
            , MAX(CASE WHEN test_subtest ='PSAT_CriticalReading' THEN Num_Score ELSE null END) as ReadingTest
            , MAX(CASE WHEN test_subtest ='PSAT_Math' THEN Num_Score ELSE null END) as MathematicsTest 
    FROM ( 
        SELECT s.Student_Number as StuNumber
               , s.lastfirst as StuName
               , s.Grade_Level as GradeLevel
                , t.name as Test_Name
                , ts.Name as Test_Subtest
                , sts.NumScore as Num_Score  
                , rank() over (partition by s.Student_Number, ts.Name order by sts.NumScore ) as score_rank
        FROM    Students s
        INNER JOIN StudentTest st ON s.ID = st.studentID  
        INNER JOIN StudentTestScore sts ON sts.StudentTestID = st.ID          
        INNER JOIN Test t ON st.TestID = t.ID  
        INNER JOIN TestScore ts ON ts.ID = sts.TestScoreID
        WHERE t.name = 'PSAT' 
        AND s.Enroll_Status=0 
        AND s.Grade_Level >=9 
        AND s.schoolid = ~(curschoolid) 
        ) TST 
    AND score_rank = 1
    GROUP BY StuNumber
              , StuName
              , GradeLevel
              , test_name
    

    过滤 rank = 1 的子查询可防止包含其他分数。排除老师的名字和其他东西应该给你一个学生一行。 “应该”,因为在没有样本数据的情况下,我无法对此进行测试。删除studentId 上的过滤器意味着所有学生都包括在内。

    如果您有实际要求来返回问题中显示的更广泛的结果集,您将需要以不同的方式满足它。


    顺便说一句,这个MAX(TO_CHAR(test_date,'MM/DD/YYYY')) 并没有做你认为它做的事情。将日期转换为字符串意味着排序使用 ASCII 值,因此 12/31/2013 高于 01/01/2016。我们可以对 Oracle 日期进行算术运算:这给出了预期的结果:MAX(test_date)

    【讨论】:

    • 嗨 APC,感谢您在没有我的数据的情况下查看此内容。我已经编辑并添加了具有更好描述的数据。我确实需要更广泛的结果,所以我认为这看起来会完全不同。想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2015-01-23
    • 1970-01-01
    • 2023-03-14
    • 2013-08-31
    • 2021-10-10
    相关资源
    最近更新 更多