Как вывести максимальное значение в sql
Перейти к содержимому

Как вывести максимальное значение в sql

Вывести максимальный запрос через having или all

Нужно вывести из таблицы максимальное значение через создание внутренней таблицы и команды having, либо ALL.

1 2 3 4
SELECT subscribers.s_name, t1.sb_subscriber, COUNT(t1.sb_subscriber) AS COUNT FROM subscriptions t1, subscribers WHERE subscribers.s_id=t1.sb_subscriber GROUP BY t1.sb_subscriber

Таблица, которую выводит этот код, во вложениях. В 3 строчке (where) я просто объединял разные таблицы для более удобного вывода.
Соответственно, нужно вывести первую строчку с count = 5.

Я пытался это сделать с помощью этого кода, но ошибка 1064.

1 2 3 4 5 6 7 8 9 10
SELECT subscribers.s_name, t1.sb_subscriber, COUNT(t1.sb_subscriber) AS COUNT FROM subscriptions t1, subscribers, ( SELECT COUNT(sb_subscriber) FROM subscriptions GROUP BY subscriptions.sb_subscriber ) AS tab WHERE subscribers.s_id=t1.sb_subscriber HAVING t1.sb_subscriber!=tab.sb_subscriber GROUP BY t1.sb_subscriber

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

Заказ считается в статусе, который был добавлен последним (поле time максимальное для данного order_id).
Не могу составит запрос, которые на вход получал бы статус, а на выходе заказы (orders) с данным статусом.

select max(os.time), os.orders from order_statuses os join orders o on os.orders = o.id where os.status = 'NEW' group by os.orders;

только мой возвращает последнее время, когда у заказа был статус ‘NEW’, а нужно заказы, у которых ‘NEW’ — последний статус.

  • Вопрос задан более трёх лет назад
  • 4146 просмотров

Форум пользователей MySQL

Помогите, пожалуйста, не могу сообразить, как при группировке по дате выбрать максимальное значение второго поля?

Таблица:
id | date | number
1 | 2016-10-21 | 1
2 | 2016-10-21 | 2
3 | 2016-10-21 | 4
4 | 2016-10-22 | 1
5 | 2016-10-22 | 8
6 | 2016-10-22 | 2

Желаемый результат:
3 | 2016-10-21 | 4
5 | 2016-10-22 | 8

#2 20.06.2016 23:37:45

vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5822

Re: Как выбрать максимальное значение при группировке?

есть как минимум 5 способов
http://sqlinfo.ru/articles/info/18.html

#3 25.06.2016 19:33:41

inmerdorm Участник Зарегистрирован: 12.08.2014 Сообщений: 24

Re: Как выбрать максимальное значение при группировке?

На сколько я понимаю, там предлагается дату (timestamp) взять как за уникальное поле, а у меня даты одинаковые, и по ним нужно сгруппировать. Видимо, я чего-то недопонимаю (

#4 25.06.2016 19:54:37

vasya Архат Откуда: Орел Зарегистрирован: 07.03.2007 Сообщений: 5822

Re: Как выбрать максимальное значение при группировке?

в статье группировка идет по пользователю для которого выбирается максимальная дата
у вас группировка по дате для которой максимальный number

в примерах из статьи замените user_id на date, а time на number

#5 29.06.2016 11:13:35

inmerdorm Участник Зарегистрирован: 12.08.2014 Сообщений: 24

Re: Как выбрать максимальное значение при группировке?

Vasya, получилось, спасибо!

Однако, к текущему моменту задача усложнилась.

Необходимо в рамках текущей даты выбрать максимальный number для каждого user_id.

Таблица:
id | date | number | user_id
1 | 2016-10-21 | 1 | 1
2 | 2016-10-21 | 2 | 1
3 | 2016-10-21 | 4 | 2
4 | 2016-10-21 | 1 | 2
5 | 2016-10-22 | 8 | 1
6 | 2016-10-22 | 2 | 1
7 | 2016-10-22 | 1 | 2
8 | 2016-10-22 | 2 | 2
9 | 2016-10-22 | 4 | 2

Желаемый результат:
2 | 2016-10-21 | 2 | 1
3 | 2016-10-21 | 4 | 2
5 | 2016-10-22 | 8 | 1
9 | 2016-10-22 | 4 | 2

Чё-то никак не могу продолжить мысль, как это сделать (

Комбинация детализированных и агрегированных данных

Пусть, помимо модели и цены принтера, требуется еще вывести максимальную и минимальную цену по всему множеству принтеров. Для новичка подобная задача зачастую представляет определенную сложность. Эта сложность состоит в дилемме: группировка или агрегация по всему множеству. Если использовать группировку, то максимум и минимум будут получены не по всей выборке, а для каждого подмножества, определяемого группировкой (в данном примере для каждой группы с одинаковой комбинацией значений ). Поскольку эта комбинация уникальна в таблице Printer учебной базы данных, то мы получим 3 совпадающих значения цены:

Консоль

Выполнить

Если же не использовать группировку, то мы можем получить только минимальное и максимальное значение, поскольку стандартный синтаксис запрещает (ввиду неоднозначности трактовки результата) использовать наряду с агрегатами детализированные данные, по которым не выполняется группировка:

Консоль

Выполнить

Проблема разрешается довольно просто, причем не единственным способом. Так можно использовать подзапросы в предложении SELECT для каждого агрегатного значения. Это возможно, поскольку подзапрос вернет одно значение, а не набор:

Решение 1

Консоль

Выполнить

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

Решение 2

Консоль

Выполнить

Почему мы утверждаем, что второй запрос будет эффективней? Дело в том, что в решении 1 подзапрос будет вычисляться дважды, а не один раз, как это делается во втором решении. Кроме того, если оптимизатор недостаточно «умный», подзапросы в первом решении будут вычисляться для каждой строки детализированных данных. Проверьте планы выполнения для своей СУБД.

Рассмотрим теперь задачу, когда агрегат зависит от текущей строки детализированных данных, например, такую.

Вывести номер модели и цену принтера, а также максимальную и минимальную цену на принтеры того же типа.

Попытаемся адаптировать для этой задачи рассмотренные выше подходы. В решении 1 подзапросы следует сделать коррелирующими :

Решение 1M

Консоль

Выполнить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *