Выбор минимального значения из нескольких столбцов в SQL
Быстрый ответ
Для выбора наименьшего значения среди нескольких столбцов в SQL обычно применяется функция LEAST:
SELECT LEAST(col1, col2, col3) AS min_col FROM table;
В результате данного запроса будет найден минимум среди col1, col2, col3 для каждой строки таблицы. Однако, стоит отметить, что не во всех СУБД поддерживается функция LEAST (например, в старых версиях SQL Server). В таких случаях можно использовать альтернативные варианты, такие как CASE или CROSS APPLY.

Если
Если ваша версия SQL Server не поддерживает функцию LEAST, существует несколько альтернативных вариантов для получения аналогичного результата.
Использование CASE
Отсутствие функции LEAST в SQL Server может расстраивать, но в таких ситуациях отлично справляется CASE:
SELECT
CASE
WHEN col1 <= col2 AND col1 <= col3 THEN col1
WHEN col2 <= col1 AND col2 <= col3 THEN col2
ELSE col3
END AS min_col
FROM table;
С помощью CASE вы сможете корректно оценить значения и выбрать наименьшее среди указанных столбцов.
Применяем CROSS APPLY в сочетании с VALUES
SQL Server не поддерживает LEAST, но вместо неё можно использовать CROSS APPLY вместе с VALUES:
SELECT p.ProductID, p.ProductName, MinPrice.Price AS MinPrice
FROM Products AS p
CROSS APPLY (
SELECT MIN(Price) AS Price
FROM (VALUES (p.Col1), (p.Col2), (p.Col3)) AS Value(Price)
) AS MinPrice;
CROSS APPLY эффективно помогает обработать "коллекцию" значений и выделить из них минимальное, при этом не требуется использование оператора UNPIVOT.
Переструктурирование данных для оптимизации
В идеале структура данных должна быть нормализована и не иметь "массивных" столбцов; лучше перенести их содержимое в отдельные строки. Такой подход улучшает эффективность работы агрегатных функций, например MIN.
Объединяем все с помощью
При необходимости можно объединить значений с помощью UNION ALL:
SELECT MIN(value) AS min_val
FROM (
SELECT col1 AS value FROM table /* Первый претендент */
UNION ALL
SELECT col2 FROM table /* Второй кандидат */
UNION ALL
SELECT col3 FROM table /* Финальный конкурсант */
) AS combined; /* Определяем минимальное значение */
Таким образом, вы сможете сформировать один столбец со всеми значениями и выбрать его минимальное значение.
SQL Server 2022 на помощь
В SQL Server 2022 была представлена долгожданная функция LEAST. Поэтому, если у вас доступна последняя версия, используйте эту функцию для упрощения запросов:
SELECT LEAST(col1, col2, col3) AS min_col FROM table;
С этой функцией поиск наименьшего значения среди различных столбцов стал значительно проще.
Визуализация
Предположим, вы на прилавке рынка, где каждый продавец предлагает свою цену:
| Продавец | Помидор 🍅 | Салат 🥬 | Морковь 🥕 |
|----------|-------------|--------------|-------------|
| Джо | $1.50 | **$0.99** | $2.10 |
| Сьюзен | **$1.25** | $1.50 | **$1.90** |
| Боб | $1.80 | $1.10 | $2.20 |
Ваша задача — найти самое выгодное предложение, то есть, самую низкую цену. Эту задачу можно решить следующим образом:
SELECT
LEAST(Tomato_Joe, Tomato_Susan, Tomato_Bob) AS Cheapest_Tomato,
LEAST(Lettuce_Joe, Lettuce_Susan, Lettuce_Bob) AS Cheapest_Lettuce,
LEAST(Carrot_Joe, Carrot_Susan, Carrot_Bob) AS Cheapest_Carrot
FROM Prices;
Такой подход позволяет сэкономить на каждой покупке.
Умное использование Pivot
Когда структура данных не поддается нормализации, можно "вывернуть" данные, преобразовав их в псевдостолбцы и применить MIN. Такой креативный подход особенно полезен, когда значения столбцов меняются динамически.
UNPIVOT
Не стоит заблуждаться: при работе с большими объемами данных подходы с использованием UNION или UNPIVOT могут отразиться на производительности. Всегда проводите тесты и при необходимости выполняйте рефакторинг. Помните о возможной перегрузке вашего сервера.
Полезные материалы
- Использование CROSS APPLY для определения минимального значения в SQL: Подробный разбор использования
CROSS APPLYв SQL Server. - Применение UNION ALL для выбора минимального значения среди числа столбцов: Подробное руководство по применению
UNION ALLдля выбора минимального значения среди нескольких столбцов. - Оптимизация SQL-запросов для вычисления минимального значения столбца: Информативная статья по оптимизации SQL-запросов, которые включают в себя поиск минимальных значений.