MIN: примеры (SQL)

Использование функции MIN для поиска минимальных значений
Раздел: Агрегатные функции, Агрегатные
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 как оконной функции для вычисления минимального значения в рамках раздела:

Пример sql
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 через коррелированный подзапрос:

Пример sql
SELECT e.EmployeeID, e.LastName,
       (SELECT MIN(HireDate) FROM Employees WHERE DepartmentID = e.DepartmentID) AS DeptFirstHire
FROM Employees e;

Применение MIN в выражении CASE для условного агрегирования:

Пример sql
SELECT DepartmentID,
       MIN(CASE WHEN Salary > 30000 THEN Salary END) AS MinSalaryOver30000
FROM Employees
GROUP BY DepartmentID;

Использование с DISTINCT для демонстрации его незначительного эффекта:

Пример sql
-- Результат будет одинаковым с ALL и DISTINCT для MIN
SELECT MIN(DISTINCT Price) AS MinUniquePrice FROM Products;

Комбинирование MIN и MAX в одном запросе для определения диапазона:

Пример sql
SELECT
    MIN(Price) AS PriceFloor,
    MAX(Price) AS PriceCeiling,
    MAX(Price) - MIN(Price) AS PriceRange
FROM Products;

MS SQL MIN function comments

En
MIN Returns the minimum value in the expression