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

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

216 голосов
/ 10 августа 2010

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

select top 1 Fname from MyTbl

В Oracle 11g ?

Ответы [ 9 ]

232 голосов
/ 10 августа 2010

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

select fname from MyTbl where rownum = 1

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

select max(fname) over (rank() order by some_factor) from MyTbl
149 голосов
/ 10 августа 2010
SELECT *
  FROM (SELECT * FROM MyTbl ORDER BY Fname )
 WHERE ROWNUM = 1;
25 голосов
/ 27 апреля 2015

С Oracle 12c (июнь 2013 г.) вы можете использовать его следующим образом.

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
9 голосов
/ 06 ноября 2015

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

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

enter image description here

Если вам нужно взять только первые две даты независимо от 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;

РЕЗУЛЬТАТ

enter image description here

В некоторых ситуациях нам нужнодля выбора 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;

РЕЗУЛЬТАТ

enter image description here

7 голосов
/ 09 декабря 2013

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

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

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

6 голосов
/ 10 августа 2010
select * from (
    select FName from MyTbl
)
where rownum <= 1;
5 голосов
/ 10 августа 2010

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

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

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

3 голосов
/ 12 марта 2014

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

Первый

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 голосов
/ 28 июля 2013

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

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

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

Удачи

...