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

Пройдите тест, узнайте какой профессии подходите
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

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

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

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

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:

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-запросов, которые включают в себя поиск минимальных значений.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какая функция используется в SQL для выбора наименьшего значения среди нескольких столбцов?
1 / 5