0Pricing
Coding Interview Prep · Урок

MIN, MAX и агрегирование нечисловых данных

Агрегируйте даты и строки и разбирайтесь в значении MIN для текста.

«MIN, MAX и агрегирование нечисловых данных» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.

MIN и MAX не только для чисел

Кандидаты предполагают, что MIN и MAX работают только с числами. Интервьюеры любят спрашивать: «Что возвращает MAX(name)? А MIN(order_date)?»

На самом деле MIN и MAX работают с любым упорядочиваемым типом — числами, датами и строками. Настоящий проверяемый навык — понимание правил упорядочивания для каждого типа.

Числовой случай

Начнём со знакомого. В числовых столбцах MIN возвращает наименьшее значение, а MAX — наибольшее. Всё просто.

Как и другие агрегатные функции, MIN и MAX игнорируют NULL. NULL никогда не является минимальным или максимальным значением; он просто пропускается. Если все значения равны NULL, обе функции возвращают NULL.

SELECT MIN(salary) AS lowest, MAX(salary) AS highest
FROM employees;

MIN и MAX для дат

Даты и временные метки полностью упорядочиваемы, поэтому MIN(order_date) возвращает самую раннюю дату, а MAX(order_date) — самую позднюю.

Так вы отвечаете на вопросы «когда был размещён первый заказ?» (MIN) и «какова самая недавняя активность?» (MAX), не выполняя сортировку и ограничение числа строк. Это идиоматичное решение на основе множеств.

SELECT
  MIN(order_date) AS first_order,
  MAX(order_date) AS latest_order
FROM orders;

Интервал дат одним запросом

Часто возникает следующий вопрос: «Как долго этот клиент остаётся активным?» Объедините MIN и MAX, а затем вычтите одно значение из другого.

Так вычисляется интервал между первым и последним заказом. Точный синтаксис вычитания зависит от диалекта, но идея MIN/MAX универсальна и показывает, что диапазоны можно задавать декларативно.

SELECT
  customer_id,
  MIN(order_date) AS first_order,
  MAX(order_date) AS last_order,
  MAX(order_date) - MIN(order_date) AS active_days
FROM orders
GROUP BY customer_id;

MIN и MAX для строк

Вот что часто удивляет. Для текстовых столбцов MIN и MAX используют лексикографический (алфавитный) порядок, основанный на сопоставлении столбца.

Поэтому MIN(name) возвращает имя, которое первым идёт в алфавитном порядке, а MAX(name) — то, которое идёт последним. MIN для {'Carol', 'Alice', 'Bob'} возвращает 'Alice', а MAX — 'Carol'.

SELECT MIN(name) AS first_alpha, MAX(name) AS last_alpha
FROM employees;
-- with Alice, Bob, Carol: 'Alice' and 'Carol'

Сопоставление и чувствительность к регистру

Порядок строк зависит от сопоставления, которое определяет чувствительность к регистру и правила локали. Во многих сопоставлениях, используемых по умолчанию, прописные буквы могут располагаться раньше строчных, поэтому результат MAX для {'apple', 'Banana'} может вас удивить.

На собеседовании упомяните, что результаты MIN/MAX для строк зависят от сопоставления. Эта тонкость отличает заученный ответ от настоящего понимания.

Что НЕ означает MIN(text)

Распространённое заблуждение заключается в том, что MIN(name) возвращает самую короткую строку, а MAX(name) — самую длинную. Это не так. Здесь учитывается исключительно порядок сортировки, а не длина.

Если вам действительно нужна самая длинная строка, отсортируйте значения по LENGTH(name) и выберите верхнюю строку либо используйте MAX(LENGTH(name)), если нужна только длина. Не путайте порядок значений с их длиной.

SELECT MAX(LENGTH(name)) AS longest_name_length
FROM employees;

MIN/MAX не объединяют столбцы

Важная ловушка: MIN и MAX независимо работают с одним столбцом. Они не возвращают всю строку, содержащую минимальное или максимальное значение.

Если написать SELECT MIN(salary), name без группировки, вы не получите имя сотрудника с самой низкой зарплатой — в зависимости от диалекта будет выдана ошибка или произвольное имя. Чтобы получить всю строку, используйте ORDER BY + LIMIT или оконную функцию.

-- Wrong assumption: this does NOT give the lowest earner's name.
-- Correct approach to get the whole row:
SELECT name, salary
FROM employees
ORDER BY salary ASC
LIMIT 1;

Повторение: поведение NULL в MIN/MAX

Как и SUM и AVG, MIN и MAX пропускают NULL. NULL не является ни наименьшим, ни наибольшим значением.

  • Смешанные значения + NULL: NULL игнорируется, возвращаются фактические минимальное и максимальное значения.
  • Только NULL или отсутствие строк: MIN и MAX возвращают NULL.

Эту согласованность всех агрегатных функций удобно сформулировать так: «Все стандартные агрегатные функции игнорируют NULL».

Объединение в группу

MIN и MAX особенно полезны вместе с GROUP BY для поиска крайних значений в каждой группе. «Самая высокая зарплата в каждом отделе» — классический пример.

Запрос возвращает по одной строке на отдел с максимальной зарплатой в этом отделе. Помните: возвращается значение, а не сотрудник. Получение имени вместе с этим значением — отдельная и распространённая задача.

SELECT department, MAX(salary) AS top_salary
FROM employees
GROUP BY department;

Как отвечать уверенно

Хороший ответ на собеседовании: «MIN и MAX работают с любым упорядочиваемым типом. Для чисел это наименьшее и наибольшее значения, для дат — самые ранняя и поздняя даты, а для строк — алфавитный порядок, определяемый сопоставлением столбца. Они игнорируют NULL и возвращают NULL только тогда, когда нет ни одного значения, отличного от NULL. Они возвращают одно значение, а не всю строку, поэтому для получения строки я использую ORDER BY с LIMIT или оконную функцию».

Быстрая проверка

Рассуждайте об агрегировании строк.

Повторение

Всё о MIN и MAX:

  • Работают с любым упорядочиваемым типом: числами, датами и строками.
  • Для строк используется алфавитный порядок/порядок сопоставления, а не длина.
  • Для дат: MIN = самая ранняя дата, MAX = самая поздняя.
  • Они игнорируют NULL; если все значения равны NULL или строк нет, возвращается NULL.
  • Они возвращают значение, а не всю строку — для этого используйте ORDER BY + LIMIT.

Далее: что происходит при использовании агрегатных функций без GROUP BY.

Часто задаваемые вопросы

Урок «MIN, MAX и агрегирование нечисловых данных» бесплатный?

Да — полный текст урока «MIN, MAX и агрегирование нечисловых данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «MIN, MAX и агрегирование нечисловых данных»?

Агрегируйте даты и строки и разбирайтесь в значении MIN для текста. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «MIN, MAX и агрегирование нечисловых данных»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. COUNT(*) и COUNT(столбец) и COUNT(DISTINCT)
  2. SUM и AVG с NULL
  3. MIN, MAX и агрегирование нечисловых данных
  4. Агрегаты без GROUP BY
← Назад к Coding Interview Prep