logo

Выбор минимального значения из нескольких столбцов в SQL

Быстрый ответ

Для выбора наименьшего значения среди нескольких столбцов в SQL обычно применяется функция LEAST:

SQL
Скопировать код
SELECT LEAST(col1, col2, col3) AS min_col FROM table;

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

Если LEAST не доступна – используем CASE или CROSS APPLY

Если ваша версия SQL Server не поддерживает функцию LEAST, существует несколько альтернативных вариантов для получения аналогичного результата.

Использование CASE

Отсутствие функции LEAST в SQL Server может расстраивать, но в таких ситуациях отлично справляется CASE:

SQL
Скопировать код
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:

SQL
Скопировать код
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 и выбираем MIN

При необходимости можно объединить значений с помощью UNION ALL:

SQL
Скопировать код
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. Поэтому, если у вас доступна последняя версия, используйте эту функцию для упрощения запросов:

SQL
Скопировать код
SELECT LEAST(col1, col2, col3) AS min_col FROM table;

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

Визуализация

Предположим, вы на прилавке рынка, где каждый продавец предлагает свою цену:

Markdown
Скопировать код
| Продавец | Помидор 🍅 | Салат 🥬 | Морковь 🥕 |
|----------|-------------|--------------|-------------|
| Джо      | $1.50       | **$0.99**    | $2.10       |
| Сьюзен   | **$1.25**   | $1.50        | **$1.90**   |
| Боб      | $1.80       | $1.10        | $2.20       |

Ваша задача — найти самое выгодное предложение, то есть, самую низкую цену. Эту задачу можно решить следующим образом:

SQL
Скопировать код
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 могут отразиться на производительности. Всегда проводите тесты и при необходимости выполняйте рефакторинг. Помните о возможной перегрузке вашего сервера.

Полезные материалы

  1. Использование CROSS APPLY для определения минимального значения в SQL: Подробный разбор использования CROSS APPLY в SQL Server.
  2. Применение UNION ALL для выбора минимального значения среди числа столбцов: Подробное руководство по применению UNION ALL для выбора минимального значения среди нескольких столбцов.
  3. Оптимизация SQL-запросов для вычисления минимального значения столбца: Информативная статья по оптимизации SQL-запросов, которые включают в себя поиск минимальных значений.