Come faccio a fare il top 1 in Oracle?

Come faccio a seguire?

select top 1 Fname from MyTbl 

In Oracle 11g ?

Se desideri solo una prima riga selezionata, puoi:

 select fname from MyTbl where rownum = 1 

Puoi anche utilizzare le funzioni analitiche per ordinare e prendere la parte superiore x:

 select max(fname) over (rank() order by some_factor) from MyTbl 
 SELECT * FROM (SELECT * FROM MyTbl ORDER BY Fname ) WHERE ROWNUM = 1; 

Con Oracle 12c (giugno 2013), puoi utilizzarlo come segue.

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

È ansible utilizzare ROW_NUMBER() con una clausola ORDER BY nella ROW_NUMBER() e utilizzare questa colonna in sostituzione di TOP N Questo può essere spiegato passo dopo passo.

Vedi la tabella seguente che ha due colonne NAME e DT_CREATED .

inserisci la descrizione dell'immagine qui

Se è necessario prendere solo le prime due date indipendentemente da NAME , è ansible 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

inserisci la descrizione dell'immagine qui

In alcune situazioni, dobbiamo selezionare i risultati TOP N rispettivi per ogni NAME . In tal caso, possiamo utilizzare PARTITION BY con una clausola ORDER BY nella sottoquery. 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

inserisci la descrizione dell'immagine qui

Puoi fare qualcosa del genere

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

È anche ansible 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 +, è ansible utilizzare le funzioni di analisi come ROW_NUMBER () ma non funzionano come ROWNUM .

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

Per selezionare la prima riga da una tabella e selezionare una riga da una tabella sono due attività diverse e occorre una query diversa. Ci sono molti modi possibili per farlo. Quattro di questi 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 risolvere questo problema con questa soluzione:

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

È ansible ordinare il risultato prima di avere il primo valore in cima.

In bocca al lupo