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

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

select top 1 Fname from MyTbl

на Oracle 11g?

9 ответов


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

select fname from MyTbl where rownum = 1

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

select max(fname) over (rank() order by some_factor) from MyTbl

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

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

SELECT * FROM   MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL          
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY

вы могли бы использовать 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


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

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

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


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

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

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


select * from (
    select FName from MyTbl
)
where rownum <= 1;

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

первый

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)

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

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

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

удачи