Respostas:
Se você quiser apenas uma primeira linha selecionada, poderá:
select fname from MyTbl where rownum = 1
Você também pode usar funções analíticas para solicitar e obter as principais x:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
alguém pode alterá-lo paraWHERE ROWNUM <= X
Com o Oracle 12c (junho de 2013), você pode usá-lo da seguinte maneira.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
aparentemente, não é necessário, você pode usar FETCH NEXT 1 ROWS ONLY
ou até mesmo FETCH FIRST ROW ONLY
, a ordem por é importante ou será equivalente a apenas usar a WHERE rownum = 1
. Eu até tentei em uma instrução OUTER APPLY e funcionou como a função TOP do Ms-SQL lá.
TIES
. Consulte este para os casos em que os laços ocorrer por versão 12c +
e12c -
Você pode usar ROW_NUMBER()
com uma ORDER BY
cláusula na subconsulta e usar esta coluna em substituição de TOP N
. Isso pode ser explicado passo a passo.
Veja a tabela abaixo que possui duas colunas NAME
e DT_CREATED
.
Se você precisar fazer apenas as duas primeiras datas, independentemente NAME
, poderá usar a consulta abaixo. A lógica foi escrita dentro da consulta
-- 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;
RESULTADO
Em algumas situações, precisamos selecionar os TOP N
resultados respectivos para cada um NAME
. Nesse caso, podemos usar PARTITION BY
com uma ORDER BY
cláusula na subconsulta. Consulte a consulta abaixo.
-- 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;
RESULTADO
with (select ... ) as
cláusula) não altera nada para esse problema, a CTE visa apenas ler e dar suporte a consultas. Certo? @Sarath Avanavu
Você pode fazer algo como
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
Você também pode usar as funções analíticas RANK e / ou DENSE_RANK , mas ROWNUM é provavelmente o mais fácil.
Usar:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Se estiver usando o Oracle9i +, você pode usar funções analíticas como ROW_NUMBER (), mas elas não terão um desempenho tão bom quanto o ROWNUM .
Para selecionar a primeira linha de uma tabela e selecionar uma linha de uma tabela, são duas tarefas diferentes e precisam de uma consulta diferente. Existem muitas maneiras possíveis de fazer isso. Quatro deles são:
Primeiro
select max(Fname) from MyTbl;
Segundo
select min(Fname) from MyTbl;
Terceiro
select Fname from MyTbl where rownum = 1;
Quarto
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
Eu tive o mesmo problema e posso corrigir isso com esta solução:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Você pode solicitar seu resultado antes para ter o primeiro valor no topo.
Boa sorte