Поиск записей с максимальными и минимальными значениями
Получайте самые большие и самые маленькие значения
«Поиск записей с максимальными и минимальными значениями» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Что такое запрос на выборку N лучших
Запрос на выборку N лучших записей отвечает на вопросы вроде «какие 3 товара самые дорогие», «какие 10 заказов самые новые» или «какие 5 оценок самые низкие».
Это всего лишь сортировка с ограничением количества результатов, но такой приём настолько распространён, что заслуживает отдельного названия.
-- Top 3 most expensive products
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 3;Записи с N наименьшими значениями
Для наименьших значений измените направление. Выполните сортировку по возрастанию с помощью ASC и возьмите первые N записей, чтобы получить самые дешёвые, самые старые или имеющие наименьшие значения строки.
-- 5 cheapest products
SELECT name, price
FROM products
ORDER BY price ASC
LIMIT 5;Добавление ключа для разрешения ничьих
Если несколько строк имеют одинаковое значение на границе выборки, база данных произвольно выбирает одну из них. Добавьте уникальный вторичный ключ, чтобы результат был стабильным и воспроизводимым.
SELECT id, name, price
FROM products
ORDER BY price DESC, id
LIMIT 3;Выборка N лучших после фильтрации
Выборка N лучших записей выполняется по отфильтрованному набору. Сначала добавьте конструкцию WHERE, чтобы ограничить набор кандидатов, затем выполните сортировку и ограничьте результат.
Так можно найти 3 самых дорогих товара в категории «Книги».
SELECT name, price
FROM products
WHERE category = 'Books'
ORDER BY price DESC
LIMIT 3;Выборка N лучших после агрегации
Ранжировать можно и вычисляемые значения. Сгруппируйте записи, выполните агрегацию, затем отсортируйте агрегат и ограничьте результат.
Этот запрос возвращает 5 клиентов, потративших больше всего в целом.
SELECT customer_id, SUM(total) AS spent
FROM orders
GROUP BY customer_id
ORDER BY spent DESC
LIMIT 5;Подход с ранжирующими функциями
Оконные функции, такие как ROW_NUMBER(), присваивают ранг каждой строке. Оберните запрос и оставьте строки с небольшим рангом. Этот подход позволяет находить N лучших записей в каждой группе.
SELECT name, price
FROM (
SELECT name, price,
ROW_NUMBER() OVER (ORDER BY price DESC) AS rn
FROM products
) ranked
WHERE rn <= 3;RANK и ROW_NUMBER при ничьих
ROW_NUMBER() всегда выдаёт разные номера, поэтому возвращает ровно N строк даже при одинаковых значениях. RANK() присваивает строкам с одинаковыми значениями один и тот же номер, поэтому выборка «трёх лучших» может вернуть больше 3 строк, если на третьем месте несколько записей.
SELECT name, price,
RANK() OVER (ORDER BY price DESC) AS rnk
FROM products;Выборка N лучших в каждой группе
Чтобы получить лучший товар в каждой категории, разделите ранжирование по категориям. PARTITION BY начинает нумерацию заново для каждой группы.
SELECT category, name, price
FROM (
SELECT category, name, price,
ROW_NUMBER() OVER (
PARTITION BY category
ORDER BY price DESC
) AS rn
FROM products
) t
WHERE rn = 1;DISTINCT ON для одной строки в каждой группе
DISTINCT ON в PostgreSQL — компактный способ выбрать лучшую строку в каждой группе. Укажите столбец группировки, затем задайте сортировку так, чтобы нужная строка шла первой в каждой группе.
SELECT DISTINCT ON (category)
category, name, price
FROM products
ORDER BY category, price DESC;Включение ничьих с помощью WITH TIES
Если вы хотите получить три лучшие строки, а также все строки с тем же значением, что и у третьей, используйте стандартную конструкцию FETCH ... WITH TIES. Она возвращает 3 строки плюс дополнительные строки, равные последней.
SELECT name, price
FROM products
ORDER BY price DESC
FETCH FIRST 3 ROWS WITH TIES;Одно лучшее значение
Для единственной строки с максимальным или минимальным значением шаблон ORDER BY ... LIMIT 1 является самым простым, более понятным и часто более быстрым решением, чем подзапрос с MAX().
-- The single most recent order
SELECT id, total, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 1;Быстрая проверка
Вы хотите получить три наибольшие цены, но если несколько строк имеют одинаковую цену на третьем месте, нужно включить все такие строки.
Повторение
Теперь вы умеете находить записи с N лучшими значениями всеми основными способами:
ORDER BY ... LIMIT nдля простых списков лучших или худших записей- Добавляйте уникальный ключ для разрешения ничьих и получения стабильных результатов
ROW_NUMBER()илиDISTINCT ONдля выборки N лучших записей в каждой группеFETCH ... WITH TIES, чтобы сохранять строки с одинаковыми значениями
На этом сортировка, ограничение результата и выборка N лучших завершены. Теперь вы можете навести настоящий порядок в любом наборе результатов.
SELECT name, price
FROM products
ORDER BY price DESC, id
LIMIT 3;Часто задаваемые вопросы
Урок «Поиск записей с максимальными и минимальными значениями» бесплатный?
Да — полный текст урока «Поиск записей с максимальными и минимальными значениями» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Поиск записей с максимальными и минимальными значениями»?
Получайте самые большие и самые маленькие значения Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Поиск записей с максимальными и минимальными значениями»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Сортировка с помощью ORDER BY
- Сортировка по нескольким столбцам
- LIMIT и OFFSET
- Поиск записей с максимальными и минимальными значениями