Risposte:
Se vuoi solo una prima riga selezionata, puoi:
select fname from MyTbl where rownum = 1
Puoi anche usare le funzioni analitiche per ordinare e prendere la prima 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
uno può cambiarlo inWHERE ROWNUM <= X
Con Oracle 12c (giugno 2013), puoi usarlo come segue.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
apparentemente non è necessario, puoi usare FETCH NEXT 1 ROWS ONLY
o anche FETCH FIRST ROW ONLY
, l'ordine da è importante o sarà equivalente al solo utilizzo di a WHERE rownum = 1
. L'ho anche provato in un'istruzione OUTER APPLY e ha funzionato come la funzione TOP di MS-SQL lì.
TIES
. Fare riferimento questo per i casi in cui i legami si verificano per la versione 12c +
e12c -
È possibile utilizzare ROW_NUMBER()
con una ORDER BY
clausola nella query secondaria e utilizzare questa colonna in sostituzione di TOP N
. Questo può essere spiegato passo dopo passo.
Vedi la tabella sotto che ha due colonne NAME
e DT_CREATED
.
Se è necessario prendere solo le prime due date indipendentemente da NAME
, è possibile utilizzare la query seguente. La logica è stata scritta all'interno della query
-- 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;
RISULTATO
In alcune situazioni, dobbiamo selezionare i TOP N
risultati rispettivamente per ciascuno NAME
. In tal caso, possiamo utilizzare PARTITION BY
una ORDER BY
clausola in una query secondaria. Fare riferimento alla query seguente.
-- 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;
RISULTATO
with (select ... ) as
clausola) non cambia nulla in questo problema, CTE mira solo a leggere e supportare le query. Destra? @Sarath Avanavu
Puoi fare qualcosa del genere
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
È inoltre possibile utilizzare le funzioni analitiche RANK e / o DENSE_RANK , ma ROWNUM è probabilmente il più semplice.
Uso:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Se si utilizza Oracle9i +, è possibile utilizzare le funzioni analitiche come ROW_NUMBER () ma non funzioneranno come ROWNUM .
Per selezionare la prima riga da una tabella e selezionare una riga da una tabella sono due attività diverse e è necessaria una query diversa. Ci sono molti modi possibili per farlo. Quattro di loro sono:
Primo
select max(Fname) from MyTbl;
Secondo
select min(Fname) from MyTbl;
Terzo
select Fname from MyTbl where rownum = 1;
Il quarto
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
Ho avuto lo stesso problema e posso risolverlo con questa soluzione:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Puoi ordinare il tuo risultato prima di avere il primo valore in cima.
In bocca al lupo