Как мне сделать топ 1 в Oracle?

165

Как мне сделать следующее?

select top 1 Fname from MyTbl

В Oracle 11g?

Показать ещё 4 комментария
Теги:
oracle11g
greatest-n-per-group

9 ответов

185
Лучший ответ

Если вы хотите только первую выбранную строку, вы можете:

select fname from MyTbl where rownum = 1

Вы также можете использовать аналитические функции для заказа и взять верхнюю часть x:

select max(fname) over (rank() order by some_factor) from MyTbl
  • 8
    Не уверен, что второй пример должен достичь ...
  • 44
    Это хорошо, если вы хотите только 1 ряд и не волнует, какой. Если вам нужны определенные строки, например самая последняя запись, вам нужно выполнить сортировку в подвыборах, например, в ответе Vash. Oracle назначает rownums перед сортировкой.
Показать ещё 6 комментариев
122
SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;
  • 5
    Этот ответ правильно получает строку TOP (упорядочивает результаты до ограничения на ROWNUM).
  • 0
    Этот ответ не является точным переводом - исходный запрос не имеет ORDER BY и не возвращает все столбцы в таблице.
Показать ещё 5 комментариев
15

С Oracle 12c (июнь 2013 г.) вы можете использовать его, как показано ниже.

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
  • 6
    Интересная команда, я использую здесь 12c, и OFFSET 0 ROWS видимому, не является необходимым, вы можете использовать только FETCH NEXT 1 ROWS ONLY или даже только FETCH FIRST ROW ONLY , порядок по важен, иначе он будет эквивалентен использованию только WHERE rownum = 1 Я даже пробовал это в инструкции OUTER APPLY, и она работала как функция TOP Ms-SQL там.
  • 0
    Вы правы @RafaelMerlin. После вашего поста я узнал, что OFFSET 0 ROWS не нужен. Это было бы полезно при получении данных между вершиной X и вершиной Y.
Показать ещё 1 комментарий
8

Вы можете использовать ROW_NUMBER() с предложением ORDER BY в подзапросе и использовать этот столбец вместо TOP N. Это можно объяснить шаг за шагом.

См. таблицу ниже, в которой есть два столбца NAME и DT_CREATED.

Изображение 4143

Если вам нужно взять только первые две даты независимо от NAME, вы можете использовать следующий запрос. Логика написана внутри запроса

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
    -- Generates numbers in a column in sequence in the order of date
    SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

РЕЗУЛЬТАТ

Изображение 4144

В некоторых ситуациях нам нужно выбрать TOP N результаты, соответствующие каждому NAME. В этом случае мы можем использовать PARTITION BY с предложением ORDER BY в подзапросе. Обратитесь к следующему запросу.

-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
  --Generates numbers in a column in sequence in the order of date for each NAME
    SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
    NAME,DT_CREATED
    FROM DEMOTOP
)TAB
WHERE RNO<3;

РЕЗУЛЬТАТ

Изображение 4145

  • 0
    Использование ROW_NUMBER () ... более правильное решение, чем в тематическом ответе. Одна проблема с этим решением (и с вариантом max (field) тоже) в том, что вы не можете делать такие вещи, как «выберите ... (выберите ROW_NUMBER () ...) для обновления
  • 0
    И это иногда очень важно в PL / SQL (извините, не удалось отредактировать предыдущий комментарий за 5 минут).
Показать ещё 4 комментария
6

Вы можете сделать что-то вроде

    SELECT *
      FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
 WHERE rownum = 1;

Вы также можете использовать аналитические функции RANK и/или DENSE_RANK, но ROWNUM, вероятно, самый простой.

  • 1
    Можете ли вы помочь с примером ранга и т. д.
5

Использование:

SELECT x.*
  FROM (SELECT fname 
          FROM MyTbl) x
 WHERE ROWNUM = 1

Если вы используете Oracle9i +, вы можете посмотреть с помощью аналитических функций, таких как ROW_NUMBER(), но они не будут работать так же, как ROWNUM.

  • 1
    Хороший ответ, но содержит крошечную опечатку. Где вы говорите, Oracle9i + не должно быть 8i? download-west.oracle.com/docs/cd/A87860_01/doc/server.817/...
  • 0
    @carpenteri: Да, аналитика была доступна в 8i - не могу вспомнить подробности, но аналитика не была доступна широкой публике до 9i.
Показать ещё 9 комментариев
4
select * from (
    select FName from MyTbl
)
where rownumn <= 1;
3

Чтобы выбрать первую строку из таблицы и выбрать одну строку из таблицы, выполните две разные задачи и потребуется другой запрос. Существует много возможных способов сделать это. Четыре из них:

Первая

select  max(Fname) from MyTbl;

Второе

select  min(Fname) from MyTbl;

Третий

select  Fname from MyTbl  where rownum = 1;

Четвертый

select  max(Fname) from MyTbl where rowid=(select  max(rowid) from MyTbl)
2

У меня была такая же проблема, и я могу исправить это с помощью этого решения:

select a.*, rownum 
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = '1'

Вы можете заказать свой результат, прежде чем иметь первое значение сверху.

Удачи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню