Выборка первых 100 строк в Oracle: использование ROW_NUMBER()
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы выбрать первые 100 строк в Oracle, используйте следующий запрос с псевдоколонкой ROWNUM
:
SELECT * FROM (
SELECT имя_колонки FROM ваша_таблица ORDER BY колонка_сортировки
) WHERE ROWNUM <= 100;
Замените имя_колонки
, ваша_таблица
и колонка_сортировки
на соответствующие значения из вашей базы данных.
Особенности ROWNUM и сортировки
Псевдоколонка ROWNUM
получает значение ещё до выполнения сортировки, если ORDER BY располагается вне подзапроса. Важно учесть, что сортировка должна производиться внутри подзапроса.
Почему нам нужно сортировать внутри подзапроса?
Без использования подзапроса ROWNUM
назначается до сортировки, такой подход может привести к непредсказуемым результатам. Oracle первым делом присваивает значение ROWNUM
, а только затем выполняет сортировку. Поэтому, чтобы получить ожидаемые результаты, включите ORDER BY
внутрь подзапроса.
Отображение последних заказов клиентов
Если вам нужны последние заказы клиентов, в особенности первые 100 из них, используйте функцию ROW_NUMBER()
:
SELECT * FROM (
SELECT client_id, order_id, create_time,
ROW_NUMBER() OVER (PARTITION BY client_id ORDER BY create_time DESC) as rn
FROM orders
) WHERE rn = 1 AND ROWNUM <= 100;
Использование FETCH FIRST в Oracle 12c
В Oracle 12c вы можете использовать клавишное слово FETCH FIRST
, которое значительно упростит ограничение результатов выборки:
SELECT client_id, order_id, create_time
FROM orders
ORDER BY create_time DESC
FETCH FIRST 100 ROWS ONLY;
Точность использования функций min/max
Для выборки первого или последнего значения в каждой группе применяйте функции min()
и max()
:
SELECT client_id, MIN(order_id) as first_order_id
FROM orders
GROUP BY client_id
FETCH FIRST 100 ROWS ONLY;
Оптимизация запросов
С учётом особенностей работы вашей базы данных, стоит использовать индексы по столбцам, используемым в сортировке, для повышения производительности.
Визуализация
Пример рейтинговой таблицы, отображающей топ-100 игроков:
SELECT * FROM (
SELECT имя_игрока, счет,
ROW_NUMBER() OVER (ORDER BY счет DESC) as позиция
FROM игровые_очки
) WHERE позиция <= 100;
Этот запрос позволяет надёжно отображать топ-100 игроков.
🎮 Рейтинг игроков:
| Позиция | Имя игрока | Очки |
| -------- | ------------- | ----- |
| 1 | AceGamer123 | 950 |
| ... | ... | ... |
| 100 | LastInLeague | 500 |
Работа со старыми версиями Oracle
В старых версиях Oracle использование ROWNUM
после ORDER BY
может привести к ошибкам. Учтите, что значения ROWNUM
присваиваются до сортировки:
SELECT * FROM (
SELECT имя_колонки, ROWNUM as rn
FROM (SELECT имя_колонки FROM ваша_таблица ORDER BY колонка_сортировки)
) WHERE rn <= 100;
Необходимо выполнить сортировку до применения ROWNUM
.
Сложные запросы? Не беспокойтесь!
В сложных сценариях с несколькими условиями или ключами сортировки выполняйте все необходимые операции в подзапросе, прежде чем применять ROWNUM
или FETCH FIRST
для ограничения выборки.
Рассмотрим ограничение строк подробнее
Для развития навыков работы с ограничением строк в Oracle изучите представленные ниже полезные материалы.
Полезные материалы
- SELECT — Описание оператора SELECT от Oracle.
- How to I limit the number of rows returned by an Oracle query after ordering? – Stack Overflow — Обсуждение вопроса ограничения числа строк после сортировки на Stack Overflow.
- Getting rows N through M of a result set – Ask TOM — Советы от Ask TOM по ограничению числа строк.
- YouTube Video Tutorial – Oracle SQL: Top N Query — Видеоурок по созданию запросов с ограничением числа строк для тех, кто предпочитает видео формат.