Mysql как вывести максимальные значения по группам

Заметки Лёвика

web программирование, администрирование и всякая всячина, которая может оказаться полезной

Выборка записей с максимальным значением в MySQL

Выбираем записи с максимальным значением определенного поля.
На всякий случай — требуется получить не сами максимальные значения, а записи, в которых определенное поле равно максимальному.

Если поля всего два — сработает простой запрос:
id|date
select id, max(date) from table1;

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

чтобы получить все записи с максимальной датой:

1) для MySQL версии 4.1 и выше можно сделать одним запросом:
select * from table1 where date in (select max(date) from table1)

2)Если версия ниже, то это надо делать в два запроса:

select @mxdate:=max(date) from table1;
select * from table1 where date=@mxdate;

id|date|count (id, date primary key) — next level

нужно вычислить count для каждого id с последней датой (с максимальным значением даты)

решение в один запрос рабочее, но нерациональное — на склейку и сравнение строк уходит неоправданно много времени
SELECT * FROM cms_catalog_goods_is_arc
WHERE CONCAT( date, id )
IN (SELECT concat( max( date ) , id ) FROM cms_catalog_goods_is_arc GROUP BY id )

Гораздо быстрей операция поиска строк с максимальным значением производится с использованием временных таблиц:

CREATE Temporary TABLE table2 (
`id` int(11) NOT NULL, `date` datetime NOT NULL, `cnt` int(11) NOT NULL,
PRIMARY KEY (`id`,`date`)
) ;
insert into table2 (id,date) select id, max(date) from table1 group by id;
update table2 t2, table1 t1 set t2.cnt=t1.cnt where t2.id=t1.id and t2.date=t1.date;

теперь в table2 все нужные нам записи.

ps. Довольно часто выполнить два простых запроса получается выгоднее, чем один сложный. http://www.samag.ru/art/07.2007/07.2007_02.html

pps В многих других СУБД (например, MS SQL, Oracle, PostgreSQL …) такого рода выборки решаются гораздо проще (с точки зрения пользователя БД) — достаточно одного незамудренного запроса. Что называется “в одну строчку” ..

В Oracle такого рода задача легко решается одним запросом. Причем, методов выбора строк с максимальным значением поля (даты в нашем случае) несколько. Часть из них приведена ниже (спасибо гостю SQL.ru с ником “Добрый Э — Эх” — http://sql.ru/forum/actualthread.aspx?tid=580229#5985168 )

1)
select *
from (
select t.*, row_number()
over(partition by num
order by dt desc) as rn
from t
)
where rn = 1;
2)
select t1.*
from t1
left join t2
on t1.num = t2.num
and t1.dt

Метки: mysql

Опубликовано Суббота, Август 2, 2008 в 05:44 в следующих категориях: Без рубрики. Вы можете подписаться на комментарии к этому сообщению через RSS 2.0. Вы можете добавить комментарий, или trackback со своего сайта.

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Комментарии (2) к записи “Выборка записей с максимальным значением в MySQL”

Привет всем!
Вчера нашел через гугл по запросу “разработка электроники на заказ цены”
Рекомендую!
Пока!

Огромное спасибо, Вы мне очень помогли, я искал именно выборку по определенному полю…

Источник

Выборка максимальных значений в группировке

Здравствуйте, делаю интернет-магазин, нужна помощь, подзабыл как сделать такое:

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

В вложенных изображениях пример, нужно чтоб из первого получилось второе. Помогите!

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Выборка из двух таблиц максимальных и уникальных значений
Друзья, здравствуйте! Бешусь с этой проблемой несколько дней. Что мне нужно: Есть две таблицы.

Выборка с максимальным значением поля по группировке
Есть таблица: id Group Value Date 1 1 1 7 2 1 2 6 3 2 .

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

Суммирование значений в группировке
Здраствуйте, . Помогите пожалуйста с суммированием итоговых значений в группировке таблицы.

Вложенное условие, при группировке значений
привет форумчане, такой вопрос, есть след. лямбда выражение: ListBestandansicht =.

Найти среднее арифметическое из минимальных значений в каждой строке и максимальных значений в каждом столбце
Дана матрица размера M*N. Найти среднее арифметическое из минимальных значений в каждой строке и.

Структура: подсчет максимальных и минимальных значений, сумм и средних значений для числовых полей
Структура должна включать не менее 10 столбцов, в том числе – строковые, числовые и дата, всего в.

Выборка двух максимальных чисел из набора
Друзья, чет затупил и не могу сообразить, дан набор чисел, скажем 10 штук, необходимо найти два.

Sql выборка максимальных элементов повторяющехся записей
Застрял на задаче, не могу никак реализовать. В таблице есть поле user ну и id 1. user1 2.

Сравнение значений между собой в порядке даты и выборка отрицательных значений разницы
Уважаемые, Помогите решить следующую нетривиальную задачу есть таблица следующего вида.

Источник

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

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

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

Учитывая приведенную ниже таблицу с столбцами персонажа, группы и возраста, как бы вы получили самого старого человека в каждой группе? (Галстук внутри группы должен дать первый алфавитный результат)

Требуемый набор результатов:

Есть супер-простой способ сделать это в MySQL:

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

Вы избегаете сложных подзапросов, которые пытаются найти max() etc, а также проблем с возвратом нескольких строк, когда существует более одной строки с одинаковым максимальным значением (как и другие ответы)

Примечание: это решение только для mysql . Все другие известные мне базы данных будут выдавать синтаксическую ошибку SQL с сообщением «неагрегированные столбцы не перечислены в предложении group by» или аналогичными. Поскольку это решение использует недокументированное поведение, более осторожный может захотеть включить тест, чтобы утверждать, что он продолжает работать, если будущая версия MySQL изменит это поведение.

Обновление версии 5.7:

Начиная с версии 5.7, sql-mode настройка включает ONLY_FULL_GROUP_BY по умолчанию, поэтому для этой работы у вас не должно быть этой опции (отредактируйте файл опции для сервера, чтобы удалить эту настройку).

Источник

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

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

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

учитывая таблицу, подобную приведенной ниже, с столбцами person, group и age, как бы вы получили самого старого человека в каждой группе? (Галстук в группе должен дать первый алфавитный результат)

желаемому результату set:

17 ответов

есть супер-простой способ сделать это в mysql:

это работает, потому что в mysql вам разрешено не aggregate non-group-BY columns, в этом случае mysql просто возвращает первый row. Решение: первого порядка данных, таких, что для каждой группы строки вы хотите, является первым, затем группы столбцов значение.

вы избегаете сложных подзапросов, которые пытаются найти max() etc, а также проблемы возврат нескольких строк, когда есть более одного с тем же максимальным значением (как и другие ответы)

Примечание: это mysql-только решение. Все другие базы данных, которые я знаю, выдадут синтаксическую ошибку SQL с сообщением «неагрегированные столбцы не перечислены в предложении group by» или аналогичном. Потому что это решение использует без документов поведение, более осторожный может включить тест, чтобы утверждать, что он остается работа должна будущая версия MySQL изменить это поведение.

обновление версии 5.7:

начиная с версии 5.7, в sql-mode установка включает в себя ONLY_FULL_GROUP_BY по умолчанию, поэтому, чтобы сделать эту работу, вы должны не есть эта опция (отредактируйте файл опции для сервера, чтобы удалить этот параметр).

как работает:

он соответствует каждой строке из o все строки b С тем же значением в столбце Group и большее значение в столбце Age . Любая строка из o не имея максимального значения своей группы в столбце Age будет соответствовать одной или нескольким строкам из b .

на LEFT JOIN делает его соответствовать самому старому человеку в группе (включая людей, которые одиноки в своей группе) с полным рядом NULL С b («нет самого большого возраста в группе»).
используя INNER JOIN делает эти строки не совпадают, и они игнорируются.

на WHERE предложение сохраняет только строки, имеющие NULL s в полях, извлеченных из b . Они-старейшие представители каждой группы.

дополнительная литература

мое простое решение для SQLite (и, вероятно, MySQL):

однако он не работает в PostgreSQL и, возможно, на некоторых других платформах.

в PostgreSQL вы можете использовать DISTINCT ON статья:

вы можете присоединиться к подзапросу, который тянет MAX(Group) и Age . Этот метод переносим в большинстве СУБД.

используя метод ранжирования.

решение axiac-это то, что сработало лучше всего для меня в конце. Однако у меня была дополнительная сложность: вычисленное «максимальное значение», полученное из двух столбцов.

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

мне пришлось выполнить левое соединение два раза, чтобы получить это поведение:

надеюсь, что это помогает! Думаю, должен быть лучший способ сделать это. хотя.

Использование Ctes-Общие Табличные Выражения:

Не уверен, что MySQL имеет функцию row_number. Если это так, вы можете использовать его, чтобы получить желаемый результат. В SQL Server вы можете сделать что-то похожее на:

мое решение работает, только если вам нужно получить только один столбец, однако для моих нужд было лучшее решение, найденное с точки зрения производительности (он использует только один запрос!):

он использует GROUP_CONCAT для создания упорядоченного списка concat,а затем подстроки только к первому.

вы также можете попробовать

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

пусть имя таблицы будет people

Если ID (и все coulmns) необходим из mytable

вот как я получаю N максимальных строк на группу в mysql

Источник

MySQL. Как получить максимальное значение

Дата публикации: 2016-02-04

От автора: этим уроком мы откроем новую тему для нашего сайта — цикл уроков, в которых мы будем учиться писать SQL запросы и решать распространенные повседневные задачи, с которыми вы можете столкнуться при работе с MySQL. Из этого урока вы узнаете, как получить максимальное значение.

С задачей, которую мы поставили для текущего урока — как получить максимальное значение — мы можем сталкиваться часто. Например, у нас есть интернет магазин и необходимо получить самый дорогой товар каталога и всю информацию о нем. Или необходимо получить, скажем, ТОП-10 самых дорогих товаров. Или выбрать наиболее дорогие товары определенной категории. Или, наоборот, получить минимальные значения и всю информацию, связанную с ними.

Согласитесь, это тот круг задач и вопросов, которые действительно могут встречаться сплошь и рядом. Для данного урока мы воспользуемся тестовой базой данных world, которую можно скачать с официального сайта (//dev.mysql.com/doc/index-other.html) или можете взять из исходников.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

В этом уроке мы напишем несколько запросов SQL, в которых решим задачи, озвученные выше. Единственное, вместо товаров у нас будут страны и города, а вместо цен — их население.

Источник

Читайте также:  Как чистить маникюрный аппарат
Оцените статью