Oracle SQL - вычисляет текущее значение и связанные значения - PullRequest
0 голосов
/ 15 октября 2018

У меня есть таблица результатов тестов студентов, год и конкретный тест, который выглядит следующим образом:

Student ID     Score    Year    TestName  GradeLevel
100001         347      2010    Algebra   8
100001         402      2011    Geometry  9
100001         NA       NA      NA        10
100001         NA       NA      NA        11
100001         525      2014    Calculus  12

В этой таблице примеров есть только один идентификатор студента, номои реальные данные, очевидно, содержат много студенческих идентификаторов.

Я пытаюсь написать запрос, который скажет мне, в каждом учебном году, каков был балл каждого ученика по последнему принятому тесту, которыйпроверить это, и в каком классе они находились. Вывод, который я хочу, должен выглядеть следующим образом:

StudentID     Year    MostRecentScore  MostRecentTest  MostRecentTestGrade
100001         2010    347              Algebra         8
100001         2011    402              Geometry        9
100001         NA      402              Geometry        9
100001         NA      402              Geometry        9
100001         2014    525              Calculus        12

Вот что я получил до сих пор:

SELECT
    STUDENTID,
    YEARID,
    MAX(Score) OVER (PARTITION BY StudentID ORDER BY Year) as "MostRecentScore",
    MAX(TestName) OVER (PARTITION BY StudentID ORDER BY Year) as "MostRecentTest",
    MAX(GradeLevel) OVER (PARTITION BY StudentID  ORDER BY Year) as "MostRecentTestGrade"

FROM TEST_SCORES

Ноэто только возврат самого последнего теста и связанных с ним значений:

StudentID     Year    MostRecentScore  MostRecentTest  MostRecentTestGrade
100001         2010    525              Calculus        12
100001         2011    525              Calculus        12
100001         NA      525              Calculus        12
100001         NA      525              Calculus        12
100001         2014    525              Calculus        12

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 16 октября 2018

В соответствии с вашим примером мы можем использовать gradelevel для определения порядка.Если это так, вы можете использовать lag() ignore nulls.Но для этого сначала нужно что-то сделать со столбцом gradelevel, что немного проблематично.Я добавил gl, который равен нулю, когда год тоже нулевой.Все остальное просто:

Демонстрация SQLFiddle

select studentid, yearid, 
       nvl(score, lag(score) ignore nulls 
                  over (partition by studentid order by gradelevel)) score,
       nvl(testname, lag(testname) ignore nulls 
                     over (partition by studentid order by gradelevel)) test,
       nvl(gl, lag(gl) ignore nulls 
               over (partition by studentid order by gradelevel)) grade
  from (select ts.*, case when yearid is null then null else gradelevel end gl 
          from test_scores ts)
  order by studentid, gradelevel

Я предположил, что значения NA равны нулю вваши данные.Если это не так, сначала вы должны использовать nullif и, вероятно, для чисел, как в столбце score, используйте to_number.Создание колонок типа score и YEAR как varchars - плохая идея.

...