powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как приклеить ещё одно поле к агрегированным данным
8 сообщений из 8, страница 1 из 1
Как приклеить ещё одно поле к агрегированным данным
    #39884707
Ла
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа! В процессе изучения SQL сам для себя придумал задачку, сам же её не смог решить. Задача была разобраться в группировке и агрегировании.

Задача звучит следующим образом:
В сформированной таблице хранятся данные об оценках студентов на экзаменах. Воображаемая экзаменационная сессия состоит из экзаменов по трём предметам - математика (math), физика (physics) и иностранный язык (language).
Каждый студент входит в одну из 4-х групп.
Таблица содержит поля:
student_name - имя студента
subject - название дисциплины
asmnt - оценка данного студента на экзамене по данной дисциплине
class_group - номер группы студента

Задача, на которой я заткнулся состоит в написании запроса на получение списка лучших (максимальная средняя оценка по всем предметам) студентов групп. Я всё это безобразие изучал в sqlite и его питонской библиотеке, поэтому у меня получилось решить задачу следующим запросом:

SELECT student_name, class_group, MAX(avasmnt)
FROM
(
SELECT student_name, class_group, AVG(asmnt) AS avasmnt
FROM assessments
GROUP BY student_name
)
GROUP BY class_group

Однако на собеседовании в одной конторке, глядя на такой код мне сказали, что sqlite это, конечно, хорошо, он такое сожрёт, но полноценные большие СУБД такое не примут - student_name не входит в список группировки, и не под функцией агрегирования. Мол, поставь дома хотя бы mysql и поработай там.
И вот что-то не складывается у меня. Вложенный запрос из приведённого получает среднюю оценку всех учеников. Далее, мне нужно сгруппировать полученные оценки по группам, выбрать максимум и... самое сложное - приклеить student_name. Я же во внешнем запросе ничего с ним не делаю?

Господа и дамы, подскажите, в какую сторону думать?
...
Рейтинг: 0 / 0
Как приклеить ещё одно поле к агрегированным данным
    #39884709
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может тебе ещё сказали, что class_group не входит в группировку и к нему не применена агрегирующая функция? (В подзапросе)

А твой запрос выдаёт ответ на "Максимальная Средняя оценка по группам" (С выводом произвольного или первого студента из каждой группы в зависимости от ПО)

Сделай тестовый пример, вбей тестовые данные - увидишь

+ в условиях задачи нет ответа на ситуацию, когда несколько студентов в группе имеют одинаковую среднюю оценку.
...
Рейтинг: 0 / 0
Как приклеить ещё одно поле к агрегированным данным
    #39884752
Ла
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183Может тебе ещё сказали, что class_group не входит в группировку и к нему не применена агрегирующая функция? (В подзапросе).
Не сказали, но, очевидно, в обоих SELECT-ах одна и та же ошибка. Мы оба это понимали.

Из вложенного запроса я могу убрать class_group, и он выдаст просто соответствие студент - средняя оценка. С конкретно этим SELECT-ом будет всё хорошо. Номер группы можно приклеить JOIN-ом. Тоже вроде не проблема.
Вопрос в том, как потом оных отгруппировать по class_goup с выводом максимума средней оценки, а вместе с ней имени и номера группы. Без имени студента - очевидно. Вопрос в том, как приклеить имя студента.

Если в группе несколько студентов, средняя оценка которых одинакова и больше других, то пускай для простоты принимается строка с любым одним из этих студентов. Не в этом на мой взгляд главная загвоздка.
...
Рейтинг: 0 / 0
Как приклеить ещё одно поле к агрегированным данным
    #39884754
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИз вложенного запроса я могу убрать class_group, и он выдаст просто соответствие студент - средняя оценка
Никто не мешает и добавить в группировку номера группы.

"В лоб", после этого можно узнать максимальный средний бал в разрезе групп.
А потом по этому самому балу соединить с твоим "вложенным запросом"
После этого встанет тот вопрос, о котором я писал.
Загвоздка не в этом, но от этого будут отличаться варианты решения.
...
Рейтинг: 0 / 0
Как приклеить ещё одно поле к агрегированным данным
    #39884844
Ла
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183Никто не мешает и добавить в группировку номера группы.

Если я добавляю вторую группировку, то результат получается аналогичным для "вложенного" запроса - просто студенты, номера групп и их средние оценки.

А вот метод "в лоб" я попробую, возможно он и есть ключ к успеху.
...
Рейтинг: 0 / 0
Как приклеить ещё одно поле к агрегированным данным
    #39884851
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛаЕсли я добавляю вторую группировку, то результат получается аналогичным для "вложенного" запроса - просто студенты, номера групп и их средние оценки.
Но он получается лингвистически правильным.
+ появляется группа, по которой можно сгруппировать на следующем этапе.
...
Рейтинг: 0 / 0
Как приклеить ещё одно поле к агрегированным данным
    #39884852
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛаА вот метод "в лоб" я попробую, возможно он и есть ключ к успеху.
Да нет. это будет получением через Ж.. правильного результата.
Потом начнется этап поиска более оптимального решения.
...
Рейтинг: 0 / 0
Как приклеить ещё одно поле к агрегированным данным
    #39886174
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ла,

одно из двух, либо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT student_name, class_group, MAX(avasmnt)
FROM
(
SELECT student_name, class_group, AVG(asmnt) AS avasmnt
FROM assessments
GROUP BY student_name, class_group
)
GROUP BY student_name, class_group



либо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT student_name, MAX(avasmnt)
FROM
(
SELECT student_name, AVG(asmnt) AS avasmnt
FROM assessments
GROUP BY student_name
)
GROUP BY student_name




Вообще, вложенные запросы с группировками одного поля -- это в любом случае бредняк какой-то.
Их можно заменить одной группировкой с агрегирующей фукнцией, которая является композицией нескольких.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как приклеить ещё одно поле к агрегированным данным
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]