Respuestas:
Si solo desea una primera fila seleccionada, puede:
select fname from MyTbl where rownum = 1
También puede usar funciones analíticas para ordenar y tomar la x superior:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
ejemplo, puede cambiarlo aWHERE ROWNUM <= X
Con Oracle 12c (junio de 2013), puede usarlo de la siguiente manera.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
aparentemente no es necesario, puedes usar FETCH NEXT 1 ROWS ONLY
o incluso FETCH FIRST ROW ONLY
, el orden por es importante o será equivalente a solo usar a WHERE rownum = 1
. Incluso lo probé en una instrucción APLICACIÓN EXTERIOR y funcionó como la función TOP de Ms-SQL allí.
TIES
. Consulte esto para los casos en que se producen corbatas para la versión 12c +
y12c -
Puede usar ROW_NUMBER()
una ORDER BY
cláusula en subconsulta y usar esta columna en reemplazo deTOP N
. Esto se puede explicar paso a paso.
Vea la tabla a continuación que tiene dos columnas NAME
y DT_CREATED
.
Si necesita tomar solo las dos primeras fechas independientemente de NAME
, puede usar la consulta a continuación. La lógica ha sido escrita dentro de la 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
En algunas situaciones, necesitamos seleccionar TOP N
resultados respectivos a cada uno NAME
. En tal caso, podemos usar PARTITION BY
con una ORDER BY
cláusula en subconsulta. Consulte la consulta a continuación.
-- 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) no cambia nada a este problema, CTE solo tiene como objetivo leer y respaldar consultas. ¿Correcto? @Sarath Avanavu
Puedes hacer algo como
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
También puedes usar las funciones analíticas RANK y / o DENSE_RANK , pero ROWNUM es probablemente la más fácil.
Utilizar:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Si usa Oracle9i +, podría usar funciones analíticas como ROW_NUMBER () pero no funcionarán tan bien como ROWNUM .
Seleccionar la primera fila de una tabla y seleccionar una fila de una tabla son dos tareas diferentes y necesitan una consulta diferente. Hay muchas formas posibles de hacerlo. Cuatro de ellos son:
primero
select max(Fname) from MyTbl;
Segundo
select min(Fname) from MyTbl;
Tercero
select Fname from MyTbl where rownum = 1;
Cuarto
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
Tuve el mismo problema y puedo solucionarlo con esta solución:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Puede ordenar su resultado antes para tener el primer valor en la parte superior.
Buena suerte