Как найти максимальное значение в столбце из вложенного подзапроса?

У меня есть следующая таблица

Студенческий билет Имя ученика Student.dept_name студент.tot_cred 128 'Чжан' «Комп. Наука». 102 12345 'Шанкар' «Комп. Наука». 32 19991 'Брандт' «История» 80 23121 'Чавес' «Финансы» 110 44553 'Пельтье' «Физика» 56 45678 «Леви» «Физика» 46 54321 'Уильямс' «Комп. Наука». 54 55739 'Санчес' 'Музыка' 38 70557 'Снег' «Физика» 0

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

Я попытался имитировать это решение, которое не включает дополнительный запрос: как найти максимальное значение и связанные с ним значения полей в SQL это именно то, что мне нужно, но с включенным подзапросом count.

SELECT sub.dept_name, max_dep
FROM (SELECT student.dept_name, COUNT(student.dept_name) as dep_count
      FROM student GROUP BY student.dept_name) as sub 
WHERE sub.max_dep = (select max(dep_count) from sub )

Это дает синтаксическую ошибку и не работает.

Я использую этот сайт, чтобы проверить свой запрос (в таблице учеников).

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

Если вы не хотите использовать ORDER BY, вам следует указать причину, потому что именно так можно это сделать.

marsze 14.04.2024 10:19

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

Jhon Silver 14.04.2024 10:26

Поскольку я тестирую его на этом веб-сайте, они поддерживают базовый SQL, но я также могу использовать MySQL

Jhon Silver 14.04.2024 10:40

Используйте ORDER BY, больше ничего не делайте. Остальные варианты хуже читаются, медленнее, не имеют никаких преимуществ. Понятия не имею, почему вам срочно хочется писать плохие SQL-запросы, а не хорошие. Прекрати! Если вы хотите чему-то научиться, сосредоточьтесь на сложных и значимых вопросах, а не на таких плохих идеях.

Jonas Metzler 14.04.2024 10:51

Примеры данных — это здорово. но можете ли вы также указать ожидаемый результат? Т.е. предоставьте полный минимально воспроизводимый пример .

jarlh 14.04.2024 11:49

Кстати, dbfiddle.uk отлично подходит для простых целей тестирования. Поддерживает несколько основных баз данных.

jarlh 14.04.2024 11:52

Вы можете сделать простой WHERE NOT EXISTS subquery, чтобы избежать ЗАКАЗАТЬ ПО.

jarlh 14.04.2024 12:37
dbfiddle.uk/KnRQi_iE, скрипт @ValNiks с добавлением запроса NOT EXISTS в and.
jarlh 14.04.2024 14:37

@JhonSilver Обратите внимание, что Генеративный ИИ (например, ChatGPT) запрещен , и прочитайте Справочный центр: Политика ИИ. Запрещено использовать инструменты искусственного интеллекта для создания или изменения содержания контента, который вы публикуете в Stack Overflow. Кроме того, инструменты ИИ известны тем, что пишут ерунду, и нет смысла просить людей здесь отлаживать неработающий код, написанный ИИ.

Dalija Prasnikar 19.04.2024 15:23
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
9
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

См. пример

select min(dept_name) dept_name,cnt
from (
   select dept_name,count(*) cnt 
   from student 
   group by dept_name
   having count(*)
      =(select max(cnt) 
        from(
             select count(*) cnt 
             from student group by dept_name
            )as counts
       )
)max_depts
group by cnt

Рассмотрим запрос по частям.

  1. Посчитать студентов на кафедре
select dept_name,count(*) cnt 
   from student 
   group by dept_name

Выход:

имя_отдела CNT Комп. наук. 3 Финансы 1 История 1 Музыка 1 Физика 3
  1. Рассчитайте максимальное количество студентов на кафедре.
(select max(cnt) 
        from(
             select count(*) cnt 
             from student group by dept_name
            )as counts
       )

Результат подзапроса counts: (cnt)(3),(1),(1),(1),(3).
Затем выберите max(cnt) из counts, результат (3).

  1. Используйте предложение HAVING для фильтрации этого вывода (подзапрос max_depts)
select dept_name,count(*) cnt 
   from student 
   group by dept_name
   having count(*)
      =(... ->3  )
имя_отдела CNT Комп. наук. 3 Физика 3
  1. Подзапрос max_depts может иметь 1 или несколько строк, где cnt то же самое.
    Итак, мы берем наименьшее значение в алфавитном порядке по min(dept_name) и группируем по cnt.
    Это значение (cnt) одинаково для всех строк. Итак, в результате мы получаем 1 строку.
select min(dept_name) dept_name,cnt
from ( ... )max_depts
group by cnt
имя_отдела CNT Комп. наук. 3

Другой пример

select min(dept_name) dept_name,cnt
from (
   select dept_name,count(*) cnt 
   from student 
   group by dept_name
)as depts_counts
where cnt=(select max(cnt) 
        from(
             select count(*) cnt 
             from student group by dept_name
            )as counts
       )
group by cnt

Там
1.Посчитайте количество студентов на каждом факультете.
2. Фильтровать по состоянию cnt=3. Фильтр применяется перед группировкой.
3. Сгруппируйте по cnt

Попробуйте Скрипка

Другие вопросы по теме