Запрос для расчета баллов за экзамен - PullRequest
1 голос
/ 01 марта 2020

Постановка проблемы:

У меня есть таблица EXAM со следующими полями и образцами данных

student_id   exam_date   exam_score
-----------------------------------
  a1        2018-03-29    75
  a1        2018-04-25    89
  b2        2018-02-24    91

Я хочу написать запрос SQL вывести следующие поля

 1. student_id
 2. exam_date
 3. highest_score_to_date
 4. average_score_to_date
 5. highest_exam_score_ever

Мой SQL Запрос:

select
  a.student_id,
  b.exam_date,
  highest_exam_score_to_date,
  average_exam_score_to_date,
  highest_exam_score_ever
from
(
   select
     student_id,
     exam_date,
     max(score) as highest_exam_score_to_date,
     avg(score) as average_exam_score_to_date
  from exam
  group by
    student_id,
    exam_date
) a

left join

(
  select
     student_id,
     max(score) as highest_exam_score_ever
  from exam
  group by
     student_id
) b
on a.student_id = b.student_id

Можно ли достичь результата, написав лучший запрос SQL?

1 Ответ

2 голосов
/ 01 марта 2020

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

Но кажется, что использовать оконные функции проще:

select 
    t.*,
    max(exam) over(partition by student_id order by exam_date) highest_score_to_date,
    avg(exam) over(partition by student_id order by exam_date) average_score_to_date,
    max(exam) over(partition by student_id) highest_score_ever
from mytable t
...