|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
Господа! В процессе изучения 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. Я же во внешнем запросе ничего с ним не делаю? Господа и дамы, подскажите, в какую сторону думать? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2019, 02:43 |
|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
Может тебе ещё сказали, что class_group не входит в группировку и к нему не применена агрегирующая функция? (В подзапросе) А твой запрос выдаёт ответ на "Максимальная Средняя оценка по группам" (С выводом произвольного или первого студента из каждой группы в зависимости от ПО) Сделай тестовый пример, вбей тестовые данные - увидишь + в условиях задачи нет ответа на ситуацию, когда несколько студентов в группе имеют одинаковую среднюю оценку. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2019, 03:50 |
|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
982183Может тебе ещё сказали, что class_group не входит в группировку и к нему не применена агрегирующая функция? (В подзапросе). Не сказали, но, очевидно, в обоих SELECT-ах одна и та же ошибка. Мы оба это понимали. Из вложенного запроса я могу убрать class_group, и он выдаст просто соответствие студент - средняя оценка. С конкретно этим SELECT-ом будет всё хорошо. Номер группы можно приклеить JOIN-ом. Тоже вроде не проблема. Вопрос в том, как потом оных отгруппировать по class_goup с выводом максимума средней оценки, а вместе с ней имени и номера группы. Без имени студента - очевидно. Вопрос в том, как приклеить имя студента. Если в группе несколько студентов, средняя оценка которых одинакова и больше других, то пускай для простоты принимается строка с любым одним из этих студентов. Не в этом на мой взгляд главная загвоздка. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2019, 13:45 |
|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
авторИз вложенного запроса я могу убрать class_group, и он выдаст просто соответствие студент - средняя оценка Никто не мешает и добавить в группировку номера группы. "В лоб", после этого можно узнать максимальный средний бал в разрезе групп. А потом по этому самому балу соединить с твоим "вложенным запросом" После этого встанет тот вопрос, о котором я писал. Загвоздка не в этом, но от этого будут отличаться варианты решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2019, 13:58 |
|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
982183Никто не мешает и добавить в группировку номера группы. Если я добавляю вторую группировку, то результат получается аналогичным для "вложенного" запроса - просто студенты, номера групп и их средние оценки. А вот метод "в лоб" я попробую, возможно он и есть ключ к успеху. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2019, 01:51 |
|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
ЛаЕсли я добавляю вторую группировку, то результат получается аналогичным для "вложенного" запроса - просто студенты, номера групп и их средние оценки. Но он получается лингвистически правильным. + появляется группа, по которой можно сгруппировать на следующем этапе. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2019, 04:38 |
|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
ЛаА вот метод "в лоб" я попробую, возможно он и есть ключ к успеху. Да нет. это будет получением через Ж.. правильного результата. Потом начнется этап поиска более оптимального решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2019, 04:40 |
|
Как приклеить ещё одно поле к агрегированным данным
|
|||
---|---|---|---|
#18+
Ла, одно из двух, либо Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
либо Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Вообще, вложенные запросы с группировками одного поля -- это в любом случае бредняк какой-то. Их можно заменить одной группировкой с агрегирующей фукнцией, которая является композицией нескольких. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.11.2019, 13:02 |
|
|
start [/forum/topic.php?fid=47&msg=39884844&tid=1828872]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 316ms |
total: | 454ms |
0 / 0 |