Предположим, у меня есть пара таблиц для хранения тестовых оценок студента, например:
tests (
testId INT,
proctoredDate DATE,
totalMark INT,
weight FLOAT,
CONSTRAINT test_id_primary_key PRIMARY KEY(testId),
...
)
student_test_marks (
studentId INT,
testId INT,
awardedMark INT,
CONSTRAINT student_test_composite_key PRIMARY KEY(studentId, testId),
...
)
Я пытаюсь определить, какой студент в данном месяце получил наивысшую совокупную оценку.Таким образом, процесс состоит в суммировании всех тестовых оценок и весов, сгруппированных по каждому ученику за указанный месяц, и возвращает только максимальную сумму.У меня уже есть рабочий запрос, но я не думаю, что он очень эффективен.
SELECT studentId
FROM student_test_marks INNER JOIN tests
ON student_test_marks.testId = tests.testId
GROUP BY studentId, EXTRACT(MONTH FROM proctoredDate)
HAVING EXTRACT(MONTH FROM proctoredDate) = 4 AND
SUM((awardedMark / totalMark) * weight) IN (
SELECT MAX(SUM((awardedMark / totalMark) * weight))
FROM student_test_marks INNER JOIN tests
ON student_test_marks.testId = test.testId
GROUP BY studentId, EXTRACT(MONTH FROM proctoredDate)
HAVING EXTRACT(MONTH FROM proctoredDate) = 4
)
Он работает, но я чувствую, что он не оптимален, поскольку запрос объединяется, группируется и фильтруется дважды.Я подумал о порядке сортировки по столбцу «Сумма» группы, а затем о выборке только первой строки, но это выглядит неуклюже.
Есть ли лучший способ решить эту проблему?