- MySQL. Как получить максимальное значение
- MAX (Transact-SQL)
- Синтаксис
- Аргументы
- Типы возвращаемых данных
- Комментарии
- Примеры
- A. Простой пример
- Б. Использование предложения OVER
- В. Использование MAX с символьными данными
- SQL-как найти наибольшее число в столбце?
- 14 ответов
- Получение записей с максимальным значением для каждой группы сгруппированных результатов SQL
- 17 ответов
- обновление версии 5.7:
- как работает:
- дополнительная литература
- SQL MAX () с HAVING
- MAX () функция с наличием
- SQL MAX () где
- SQL MAX () с оператором IN
- SQL MAX () с HAVING и IN
MySQL. Как получить максимальное значение
Дата публикации: 2016-02-04
От автора: этим уроком мы откроем новую тему для нашего сайта — цикл уроков, в которых мы будем учиться писать SQL запросы и решать распространенные повседневные задачи, с которыми вы можете столкнуться при работе с MySQL. Из этого урока вы узнаете, как получить максимальное значение.
С задачей, которую мы поставили для текущего урока — как получить максимальное значение — мы можем сталкиваться часто. Например, у нас есть интернет магазин и необходимо получить самый дорогой товар каталога и всю информацию о нем. Или необходимо получить, скажем, ТОП-10 самых дорогих товаров. Или выбрать наиболее дорогие товары определенной категории. Или, наоборот, получить минимальные значения и всю информацию, связанную с ними.
Согласитесь, это тот круг задач и вопросов, которые действительно могут встречаться сплошь и рядом. Для данного урока мы воспользуемся тестовой базой данных world, которую можно скачать с официального сайта (//dev.mysql.com/doc/index-other.html) или можете взять из исходников.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
В этом уроке мы напишем несколько запросов SQL, в которых решим задачи, озвученные выше. Единственное, вместо товаров у нас будут страны и города, а вместо цен — их население.
Источник
MAX (Transact-SQL)
Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных
Возвращает максимальное значение выражения.
Синтаксические обозначения в Transact-SQL
Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
ALL
Применяет агрегатную функцию ко всем значениям. ALL является параметром по умолчанию.
DISTINCT
Указывает, что учитывается каждое уникальное значение. Параметр DISTINCT не имеет смысла при использовании функцией MAX и доступен только для совместимости со стандартом ISO.
expression
Может быть константой, именем столбца или функцией, а также любым сочетанием арифметических, побитовых и строковых операторов. MAX можно использовать со столбцами numeric, character, uniqueidentifier и datetime, но не со столбцами bit. Агрегатные функции и вложенные запросы не допускаются.
Дополнительные сведения см. в разделе Выражения (Transact-SQL).
OVER ( partition_by_clause [ order_by_clause ] )
partition_by_clause делит результирующий набор, полученный с помощью предложения FROM, на секции, к которым применяется функция. Если этот параметр не указан, функция обрабатывает все строки результирующего набора запроса как отдельные группы. order_by_clause определяет логический порядок, в котором выполняется операция. partition_by_clause использовать обязательно. Дополнительные сведения см. в статье Предложение OVER (Transact-SQL).
Типы возвращаемых данных
Возвращает то же значение, что и expression.
Комментарии
При выполнении функции MAX все значения NULL пропускаются.
MAX возвращает NULL, если нет строк для выбора.
При использовании со столбцами, содержащими символьные значения, функция MAX находит наибольшее значение в упорядоченной последовательности.
MAX — это детерминированная функция, если она используется без предложений OVER и ORDER BY. Она не детерминирована при использовании с предложениями OVER и ORDER BY. Дополнительные сведения см. в разделе Deterministic and Nondeterministic Functions.
Примеры
A. Простой пример
В следующем примере возвращается наибольший (максимальный) размер налога в базе данных AdventureWorks2012.
Б. Использование предложения OVER
В приведенном ниже примере рассматривается применение функций MIN, MAX, AVG и COUNT с предложением OVER для получения статистических значений для каждого из отделов в таблице HumanResources.Department в базе данных AdventureWorks2012.
В. Использование MAX с символьными данными
В приведенном ниже примере возвращается имя базы данных, которое является последним при сортировке по алфавиту. В нем используется WHERE database_id для обработки только системных баз данных.
Источник
SQL-как найти наибольшее число в столбце?
допустим у меня есть следующие данные в таблице customers: (не более)
какой оператор SELECT может получить мне номер 22 в столбце ID?
Мне нужно сделать что-то вроде этого, чтобы создать уникальный идентификатор. Конечно, я могу позволить системе сделать это с помощью автоматического приращения, но как тогда я получу автоматически сгенерированный идентификатор?
Я подумал о «SELECT ID FROM Customers» и подсчете возвращенных строк, но это кажется ужасно неэффективным и в в этом случае он неправильно вернет «3», хотя мне нужен уникальный идентификатор 23.
14 ответов
Если вы только что вставили запись в таблицу Customers и вам нужно значение недавно заполненного поля ID, вы можете использовать функцию SCOPE_IDENTITY. Это полезно, только если вставка произошла в той же области, что и вызов SCOPE_IDENTITY.
Это может быть или не быть полезным для вас, но это хорошая техника, чтобы быть в курсе. Он также будет работать с автоматически генерируемыми столбцами.
затем получите идентификатор.
, чтобы получить его в любое время, вы можете сделать SELECT MAX(Id) FROM Customers .
в процедуре, которую вы добавляете, однако, вы также можете использовать SCOPE_IDENTITY — чтобы получить идентификатор, последний добавленный этой процедурой.
Это безопаснее, потому что это гарантирует вам получить ваш Id —на всякий случай, если другие добавляются в базу данных одновременно.
если вы говорите MS SQL, вот самый эффективный способ. Это извлекает текущее семя идентификатора из таблицы на основе любого столбца идентификатора.
используя MAX(id) более общий, но, например, у меня есть таблица с 400 миллионами строк, которая занимает 2 минуты, чтобы получить MAX(id) . IDENT_CURRENT — это почти мгновенно.
если вы используете AUTOINCREMENT использовать:
Postgres обрабатывает это аналогично через
Если вы не используете автоинкрементные поля, вы можете достичь аналогичного результата с примерно следующим образом:
Это гарантирует, что нет никаких шансов на состояние гонки, которое может быть вызвано кем-то другим, вставляющим в таблицу между извлечением максимального идентификатора и вставкой новой записи.
это использование стандартного SQL, нет никаких сомнений в том, что лучшие способы достичь этого с помощью определенных СУБД, но они не обязательно портативны (что-то мы принимаем очень серьезно в нашем магазине).
вы также можете использовать реляционную алгебру. Немного длительная процедура, но здесь нужно просто понять, как работает MAX ():
ваш ответ: Имя_таблицы ⋈ Е1
в основном то, что вы делаете, это вычесть набор упорядоченных отношений (a, b), в которых а b из A, где a, b ∈ A.
зависит от того, какую реализацию SQL вы используете. Как MySQL, так и SQLite, например, имеют способы получить последний идентификатор вставки. На самом деле, если вы используете PHP, есть даже отличная функция для именно этого mysql_insert_id().
вы, вероятно, должны использовать эту функцию MySQL, а не смотреть на все строки, чтобы получить самый большой идентификатор вставки. Если ваш стол станет большим, это может стать очень неэффективным.
Источник
Получение записей с максимальным значением для каждой группы сгруппированных результатов 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
Источник
SQL MAX () с HAVING
MAX () функция с наличием
В этой статье мы обсудили, как SQL HAVING CLAUSE можно использовать вместе с SQL MAX (), чтобы найти максимальное значение столбца для каждой группы. SQL HAVING CLAUSE зарезервирован для статистической функции.
Использование предложения WHERE вместе с SQL MAX () также описано на этой странице.
SQL IN OPERATOR, который проверяет значение в наборе значений и извлекает строки из таблицы, также может использоваться с функцией MAX.
Пример :
Образец таблицы: клиент
Чтобы получить данные ‘cust_city’, ‘cust_country’ и максимальный размер «привели_амт» из таблицы клиентов при следующих условиях —
1. комбинация cust_country и cust_city должна создать группу
можно использовать следующий оператор SQL:
Иллюстрированная презентация:
SQL MAX () где
Образец таблицы: клиент
Чтобы получить данные «cust_country» и максимального значения «yal_amt »из таблицы« customer »с соблюдением следующих условий:
1. ‘cust_country’ должен быть отформатирован в группе,
2. оценка должна быть 2,
можно использовать следующий оператор SQL:
Иллюстрированная презентация:
SQL MAX () с оператором IN
Образец таблицы: клиент
Чтобы получить данные для «открытие_amt» и максимум «выдающиеся_amt» из таблицы «клиент» при следующих условиях —
1. «Opening_amt» должен прийти в группу,
2. значение ‘creation_amt’ должно быть 3000, или 8000, или 10000,
можно использовать следующий оператор SQL:
Иллюстрированная презентация:
SQL MAX () с HAVING и IN
Пример таблицы: заказы
Чтобы получить данные «agent_code», количество агентов в виде «count (agent_code)» и максимальное значение ord_amount из таблицы «orders» при следующих условиях:
1. ‘agent_code’ должен быть отформатирован в группе,
2. максимальное значение ord_amount должно быть 500, 800 или 2000,
можно использовать следующий оператор SQL:
Примечание. Выводы указанного оператора SQL, показанного здесь, взяты с использованием Oracle Database 10g Express Edition.
Вот слайд-презентация всех агрегатных функций.
Источник