Подтвердить что ты не робот

Как выбрать 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

Любые идеи? Спасибо.

4b9b3361

Ответ 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)

Ответ 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

ПРИМЕЧАНИЕ. Я полагаю, что ваш внутренний запрос в порядке. Пожалуйста, поделитесь своими результатами.