Как выбрать Top 100 строк в Oracle?
Мое требование - получить последний заказ клиента, а затем получить 100 лучших записей.
Я написал один запрос, как показано ниже, для получения последних заказов для каждого клиента. Внутренний запрос работает нормально. Но я не знаю, как получить первые 100 на основе результатов.
SELECT * FROM (
SELECT id, client_id, ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn
FROM order
) WHERE rn=1
Любые идеи? Спасибо.
Ответы
Ответ 1
Предполагая, что create_time содержит время, когда был создан заказ, и вам нужно 100 клиентов с последними заказами, вы можете:
- добавьте create_time в ваш самый внутренний запрос
- упорядочить результаты вашего внешнего запроса с помощью
create_time desc
- добавить внешний запрос, который фильтрует первые 100 строк, используя
ROWNUM
Запрос:
SELECT * FROM (
SELECT * FROM (
SELECT
id,
client_id,
create_time,
ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn
FROM order
)
WHERE rn=1
ORDER BY create_time desc
) WHERE rownum <= 100
ОБНОВЛЕНИЕ для Oracle 12c
С выпуском 12.1 Oracle представила "настоящие" запросы Top-N. Используя новый синтаксис FETCH FIRST...
, вы также можете использовать:
SELECT * FROM (
SELECT
id,
client_id,
create_time,
ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn
FROM order
)
WHERE rn = 1
ORDER BY create_time desc
FETCH FIRST 100 ROWS ONLY)
Ответ 2
вы должны использовать rownum в oracle, чтобы делать то, что вы ищете
where rownum <= 100
см. также те ответы, которые помогут вам
предел в оракуле
выберите вершину в оракуле
выберите верх в оракуле 2
Ответ 3
Первые 10 клиентов вставлены в БД (таблица клиентов):
select * from customers where customer_id <=
(select min(customer_id)+10 from customers)
Last 10 customers inserted into db (table customers):
select * from customers where customer_id >=
(select max(customer_id)-10 from customers)
Надеюсь это поможет....
Ответ 4
Как сказал Монер Камаль, вы можете сделать это просто:
SELECT id, client_id FROM order
WHERE rownum <= 100
ORDER BY create_time DESC;
Обратите внимание, что порядок выполняется после получения 100 строк. Это может быть полезно для тех, кто не хочет заказывать.
Ответ 5
Попробуйте следующее:
SELECT *
FROM (SELECT * FROM (
SELECT
id,
client_id,
create_time,
ROW_NUMBER() OVER(PARTITION BY client_id ORDER BY create_time DESC) rn
FROM order
)
WHERE rn=1
ORDER BY create_time desc) alias_name
WHERE rownum <= 100
ORDER BY rownum;
Или TOP:
SELECT TOP 2 * FROM Customers; //But not supported in Oracle
ПРИМЕЧАНИЕ. Я полагаю, что ваш внутренний запрос в порядке. Пожалуйста, поделитесь своими результатами.