SELECT
MIN(amount) AS min_check,
MAX(amount) AS max_check
FROM orders;
Результат:
min_check | max_check ----------+---------- 150.00 | 9800.00
SELECT
user_id,
MIN(order_date) AS first_order,
MAX(order_date) AS last_order
FROM orders
GROUP BY user_id;
Результат:
user_id | first_order | last_order --------+-------------+------------ 8 | 2026-01-12 | 2026-05-30 42 | 2026-02-03 | 2026-06-28
SELECT
order_date,
amount,
MAX(amount) OVER (ORDER BY order_date) AS max_so_far
FROM orders;
Результат:
order_date | amount | max_so_far -----------+---------+----------- 2026-05-01 | 1200.00 | 1200.00 2026-05-02 | 1600.00 | 1600.00 2026-05-03 | 900.00 | 1600.00Порешать SQL-задачи в тренажёре →
Классика — найти дату первого и последнего заказа пользователя через MIN(order_date)/MAX(order_date) с GROUP BY. На собесе просят достать строку с максимумом (argmax) — там уже нужен ROW_NUMBER().
Да. Для дат вернут самую раннюю и самую позднюю, для строк — минимальную и максимальную по алфавиту (с учётом кодировки/collation). Тип результата совпадает с типом столбца.
MIN() возвращает наименьшее значение независимо от порядка строк, а FIRST_VALUE() — значение первой строки в заданной сортировке окна. Если отсортировать окно по возрастанию того же столбца, они совпадут, но в общем случае это разные вещи.
Одной MAX() мало — она вернёт только значение. Используйте оконную ROW_NUMBER() OVER (ORDER BY x DESC) и отберите строку с номером 1, либо подзапрос с фильтром по MAX(x). Это классический вопрос про argmax на собесе.
ROW_NUMBER · RANK · DENSE_RANK · LAG · LEAD · NTILE
Открыть SQL-тренажёр (565 задач) →