0Pricing
SQL Academy · Урок

Поиск записей с максимальными и минимальными значениями

Получайте самые большие и самые маленькие значения

«Поиск записей с максимальными и минимальными значениями» — бесплатный урок 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 — локальная установка не требуется.

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

  1. Сортировка с помощью ORDER BY
  2. Сортировка по нескольким столбцам
  3. LIMIT и OFFSET
  4. Поиск записей с максимальными и минимальными значениями
← Назад к SQL Academy