MIN: примеры (SQL)
MIN(expression any comparable): Same as expressionОписание функции MIN
Функция MIN является агрегатной функцией в Transact-SQL, которая возвращает минимальное значение в наборе данных. Она применяется в инструкциях SELECT с предложением GROUP BY или для вычисления минимума по всем строкам результирующего набора.
Функция используется для анализа числовых, символьных и датовых данных. Она игнорирует значения NULL, за исключением случаев, когда все значения в наборе равны NULL; тогда возвращается NULL.
Синтаксис: MIN ( [ ALL | DISTINCT ] expression )
Аргументы:
ALL(неявно применяется по умолчанию): функция применяется ко всем значениям.DISTINCT: учитывает только уникальные значения, однако для функции MIN этот аргумент практически не влияет на результат, так как минимальное значение от повторений не меняется.expression: допустимое выражение столбца, имени столбца, переменной или другого типа, за исключением типов данныхtext,ntextиimage. Может использоваться с числовыми, символьными,uniqueidentifierи датовыми типами.
Возвращаемый тип совпадает с типом аргумента expression.
Базовые примеры использования
Поиск минимальной цены товара в таблице Products:
SELECT MIN(Price) AS MinPrice FROM Products;MinPrice 19.99
Определение самой ранней даты найма сотрудника:
SELECT MIN(HireDate) AS FirstHire FROM Employees;FirstHire 2015-03-15
Использование с предложением GROUP BY для поиска минимальной стоимости в каждой категории:
SELECT CategoryID, MIN(Price) AS MinPrice
FROM Products
GROUP BY CategoryID;CategoryID MinPrice 1 20.00 2 35.50 3 15.75
Применение к символьным данным для поиска первого названия по алфавиту:
SELECT MIN(ProductName) AS FirstProduct FROM Products;FirstProduct Apple Juice
Похожие функции в MS SQL
MAX возвращает максимальное значение в наборе. Используется аналогично MIN, но для поиска наибольшего элемента.
TOP (1) ... ORDER BY с предложением ORDER BY может возвращать строку с минимальным значением, включая другие столбцы. Этот метод полезен, когда нужны не только агрегированные данные.
FIRST_VALUE является оконной функцией, которая возвращает первое значение из упорядоченного набора. Позволяет получить минимум в рамках окна без группировки всего набора.
PERCENTILE_CONT и PERCENTILE_DISC могут использоваться для вычисления перцентилей, где 0-й перцентиль соответствует минимальному значению.
Аналоги функции в других СУБД
MySQL, PostgreSQL, SQLite: Синтаксис MIN идентичен SQL Server. Пример для PostgreSQL:
SELECT MIN(unit_price) FROM products;min 2.50
Oracle: Также поддерживает MIN. Дополнительно, в Oracle можно использовать KEEP (DENSE_RANK FIRST ORDER BY ...) в сочетании с FIRST для получения других столбцов строки с минимальным значением.
SELECT department_id,
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY salary) AS min_sal
FROM employees
GROUP BY department_id;Sybase ASE: Функция MIN работает аналогично. Некоторые различия могут касаться обработки типов данных, например, VARCHAR.
Типичные ошибки при использовании
Неправильное использование в предложении WHERE. Агрегатные функции нельзя применять в WHERE, для этого используется HAVING.
-- Ошибка
SELECT CategoryID, MIN(Price)
FROM Products
WHERE MIN(Price) > 10
GROUP BY CategoryID;Сообщение об ошибке: Агрегатные функции нельзя использовать в предложении WHERE.
Попытка использовать MIN с типами данных, не поддерживающими сравнение.
-- Ошибка при наличии столбца типа image
SELECT MIN(Photo) FROM Employees;Сообщение об ошибке: Агрегатную функцию MIN нельзя использовать для значений типа image.
Использование в одном SELECT неагрегированных столбцов без GROUP BY.
-- Ошибка, если ProductName не входит в GROUP BY и не является аргументом агрегатной функции
SELECT ProductName, MIN(Price)
FROM Products;Изменения в последних версиях
В SQL Server 2012 были представлены оконные функции, что позволило использовать MIN как оконную функцию с предложением OVER. Это расширило возможности без необходимости группировки.
В SQL Server 2017 улучшена обработка MIN в сочетании с функциями для работы с графами, но сама функция MIN не претерпела значительных синтаксических изменений.
В SQL Server 2019 появились улучшения в обработке агрегатных функций в режиме Batch Mode для columnstore индексов, что может повысить производительность запросов с MIN на больших таблицах.
Расширенные примеры
Использование MIN как оконной функции для вычисления минимального значения в рамках раздела:
SELECT OrderID, ProductID, Quantity,
MIN(Quantity) OVER (PARTITION BY OrderID) AS MinQuantityPerOrder
FROM OrderDetails;OrderID ProductID Quantity MinQuantityPerOrder 10248 11 12 12 10248 42 10 10 10249 72 5 5
Поиск минимальной даты для каждого сотрудника без использования GROUP BY через коррелированный подзапрос:
SELECT e.EmployeeID, e.LastName,
(SELECT MIN(HireDate) FROM Employees WHERE DepartmentID = e.DepartmentID) AS DeptFirstHire
FROM Employees e;Применение MIN в выражении CASE для условного агрегирования:
SELECT DepartmentID,
MIN(CASE WHEN Salary > 30000 THEN Salary END) AS MinSalaryOver30000
FROM Employees
GROUP BY DepartmentID;Использование с DISTINCT для демонстрации его незначительного эффекта:
-- Результат будет одинаковым с ALL и DISTINCT для MIN
SELECT MIN(DISTINCT Price) AS MinUniquePrice FROM Products;Комбинирование MIN и MAX в одном запросе для определения диапазона:
SELECT
MIN(Price) AS PriceFloor,
MAX(Price) AS PriceCeiling,
MAX(Price) - MIN(Price) AS PriceRange
FROM Products;