Бесплатный вебинар
«как найти любимую работу»
Подарки на 150 000 ₽ за участие
Живой эфир
Записи не будет!
00:00:00:00
дн.ч.мин.сек.

Эффективный выбор последних строк в SQL без ORDER BY

Быстрый ответ

Для того чтобы извлечь последние N строк в SQL, воспользуйтесь сочетанием команд TOP и ORDER BY с ключевым полем, например, id или date, упорядоченными в обратном порядке. Данный приём переворачивает ваш набор данных таким образом, что последние записи оказываются вверху. Вот как можно выбрать пять последних записей:

SQL
Скопировать код
SELECT TOP 5 *
FROM TableName
ORDER BY KeyColumn DESC;

Не забудьте заменить TableName на название вашей таблицы и KeyColumn на название столбца, которое вы используете для сортировки (например, id или timestamp).

Кинга Идем в IT: пошаговый план для смены профессии

Стратегии запросов для больших наборов данных

При работе с крупными наборами данных использование ORDER BY может оказаться непрактичным из-за большой нагрузки на производительность. Рассмотрим альтернативные методы:

1. "ROW_NUMBER()": Целенаправленный выбор

Функция ROW_NUMBER() в сочетании с Общими Табличными Выражениями (CTE) или подзапросами упрощает работу с большим объёмом данных, так как каждой строке присваивается уникальный номер.

SQL
Скопировать код
-- Это немного похоже на присваивание каждому студенту уникального номера!
WITH NumericalTable AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY KeyColumn DESC) AS rownum
    FROM TableName
)
SELECT *
FROM NumericalTable
WHERE rownum <= N;

Вместо N подставьте нужное вам число строк.

Подробнее об этом расскажет наш спикер на видео
skypro youtube speaker

2. "EXCEPT": Математическая альтернатива

Оператор EXCEPT позволяет исключить все строки, кроме последних N, применяя операцию разности множеств.

SQL
Скопировать код
-- Математика в действии! Кто бы мог подумать?
SELECT *
FROM TableName
EXCEPT
SELECT TOP (SELECT COUNT(*) – N FROM TableName)
*
FROM TableName;

Этот метод особенно полезен для ускорения выполнения запросов без полной сортировки больших таблиц.

3. "OFFSET FETCH" в SQL Server 2012+

В SQL Server 2012 и более новых версиях доступна конструкция OFFSET FETCH, которая очень удобна для постраничного просмотра результатов и выбора фиксированного количества строк, начиная с определённой позиции.

SQL
Скопировать код
-- Это как перелистывание страниц в книге!
SELECT *
FROM TableName
ORDER BY KeyColumn DESC
OFFSET (SELECT COUNT(*) – N FROM TableName) ROWS
FETCH NEXT N ROWS ONLY;

Внимание к производительности!

При выборке последних N строк обратите внимание на производительность, особенно при работе с большими наборами данных. Индексы в столбце, по которому производится сортировка, значительно увеличивают скорость выполнения запросов.

Визуализация

Представьте ваши данные как поезд (🚂), где каждый вагон — это отдельная строка данных SQL Server:

Markdown
Скопировать код
Данные в форме поезда (🚂): [Вагон 1 – Самый старый 📆, ..., Вагон N-2 🚃, Вагон N-1 🚃, Вагон N – Самый новый 🆕]

Когда мы выполняем запрос SELECT LAST N Rows, наша внимание сосредоточена на последних вагонах:

Markdown
Скопировать код
👀: [Вагон N-1 🚃, Вагон N – Самый новый 🆕]

Вот SQL-запрос, который ставит в движение наш поезд:

SQL
Скопировать код
SELECT * FROM (SELECT TOP N * FROM YourTable ORDER BY YourColumn DESC) sub ORDER BY YourColumn ASC

Следите за обновлениями ваших данных!

Полезные материалы

  1. PostgreSQL: Документация: 7.6. LIMIT and OFFSET — описание метода постепенного выбора результатов запроса, используемого в Postgres.
  2. TOP (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация по TOP в SQL Server.
  3. OVER Clause (Transact-SQL) – SQL Server | Microsoft Learn — использование OVER и ROW_NUMBER для сессий сортировки.
  4. FROM (Transact-SQL) | Microsoft Learn — примеры использования подзапросов в FROM.
  5. ORDER BY Clause (Transact-SQL) – SQL Server | Microsoft Learn — описание методов типа OFFSET FETCH для постраничного вывода результатов в SQL Server.
  6. Основы плана выполнения – Simple Talk — введение в понимание производительности SQL Server.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой метод позволяет исключить все строки, кроме последних N, в SQL?
1 / 5