GREATEST и LEAST — выбор максимума и минимума из списка значений в одной строке

GREATEST и LEAST сравнивают переданные аргументы в пределах одной строки и возвращают, соответственно, наибольшее и наименьшее значение. Аналитику это удобно, когда нужно сравнить несколько колонок по горизонтали (например, три даты активности) или зажать число в диапазон без громоздкого CASE. Функции есть в PostgreSQL, MySQL и Oracle; в SQLite отдельных ключевых слов нет, но MAX() и MIN() с несколькими аргументами работают как скалярные аналоги. Внимание к NULL: PostgreSQL их игнорирует, а MySQL возвращает NULL, если NULL встретился хотя бы в одном аргументе.

Синтаксис

GREATEST(value1, value2, ...) LEAST(value1, value2, ...)

Примеры использования

Пример 1: Наибольшая из нескольких колонок-дат

SELECT
  user_id,
  GREATEST(last_login, last_order, last_event) AS last_activity
FROM users;

Результат:

user_id | last_activity
--------+--------------
     17 | 2026-07-09
     42 | 2026-07-11

Пример 2: Ограничить значение снизу (floor до 0)

SELECT
  order_id,
  GREATEST(amount - 500, 0) AS after_discount
FROM orders;

Результат:

order_id | after_discount
---------+---------------
    1001 |            700
    1002 |              0

Пример 3: LEAST и NULL в PostgreSQL

SELECT LEAST(100, NULL, 50) AS min_val;

Результат:

min_val
-------
     50
Порешать SQL-задачи в тренажёре →

Типичная ошибка

Это построчные функции, а не агрегаты — не путай с MIN()/MAX() по колонке (GREATEST сравнивает аргументы в одной строке). В PostgreSQL GREATEST/LEAST игнорируют NULL и вернут NULL только если все аргументы NULL; в MySQL любой NULL-аргумент делает результат NULL. В SQLite ключевых слов нет — используй MAX()/MIN() с несколькими аргументами.

Где спрашивают на собеседовании

Спрашивают, когда надо сравнить значения по горизонтали (несколько дат или сумм в одной строке) или зажать число в диапазон в паре с CASE. Частый follow-up — объяснить отличие от агрегатных MIN/MAX.

FAQ: частые вопросы про GREATEST / LEAST

Чем GREATEST отличается от MAX()?

GREATEST — построчная (скалярная) функция: она сравнивает свои аргументы внутри одной строки и не группирует данные. MAX() — агрегат: он ищет максимум по всем строкам колонки и требует GROUP BY. GREATEST(a, b, c) и MAX(col) решают разные задачи и не взаимозаменяемы.

Работает ли GREATEST в SQLite и MySQL?

В MySQL и PostgreSQL есть готовые GREATEST и LEAST. В SQLite таких ключевых слов нет, но встроенные MAX() и MIN() при передаче нескольких аргументов ведут себя как скалярные аналоги — MAX(a, b, c) вернёт наибольший из значений строки. Учитывай разницу в обработке NULL между диалектами.

Как GREATEST обрабатывает NULL?

Поведение зависит от диалекта. PostgreSQL и Oracle пропускают NULL-аргументы и возвращают NULL только когда все аргументы NULL. MySQL строже: любой NULL среди аргументов делает результат NULL, поэтому там значения часто оборачивают в COALESCE.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Условная логика · null-handling

Другие функции SQL

COALESCE · NULLIF · CASE WHEN · COUNT · CAST · ROUND

Открыть SQL-тренажёр (565 задач) →