Come ottenere la seconda o terza voce più grande da un tavolo

Qualcuno può dirmi come scoprire la non più grande voce da un tavolo in Oracle?

Come per il più grande possiamo usare MAX (column_name) c’è un modo efficace per trovare anche l’ennesimo più grande ?

 SELEZIONA
 A PARTIRE DAL (
   SELEZIONA some_column, 
          row_number () over (ordine di your_sort_column desc) come row_num
   DA qualche_table
 ) t
 WHERE row_num = 3

Se ti aspetti che più di una riga abbia lo stesso valore in your_sort_column puoi anche usare la funzione rank ()

 SELEZIONA
 A PARTIRE DAL (
   SELEZIONA some_column, 
          rank () over (ordine di your_sort_column desc) come row_rank
   DA qualche_table
 ) t
 DOVE row_rank = 3

Questo può restituire più di una riga ..

puoi trovare l’ennesimo valore maggiore della colonna usando la seguente query

 SELECT * FROM TableName a WHERE n = (SELECT count(DISTINCT(b.ColumnName)) FROM TableName b WHERE a.ColumnName <=b.ColumnName); 

Penso che la query sottostante funzionerà per trovare il secondo record più alto con NOT IN.

SELECT MAX( userId )FROM table WHERE userId NOT IN (SELECT MAX( userId )FROM table)

semplice e utile …

Per ottenere il secondo stipendio più grande, usa questo:

 select salary from (select s2.salary,rownum rm from (select distinct salary from employees order by salary desc) s2 where rownum<=2) where rm >= 2 

Funziona per il secondo stipendio più alto,

 $query = "SELECT * FROM `table_name` ORDER BY field_name` DESC LIMIT 1 , 1 "; 

È ansible ORDER BY column name e quindi LIMIT 1,1 per ottenere il secondo

modificare

Ops, non ho visto il tag Oracle, mi dispiace.
ORDER BY column name WHERE ROWNUM = 2 dovrebbe funzionare meglio.

 SELECT DISTINCT (a.sal) FROM EMP A WHERE &N = ( SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal ); 

Sostituisci &N con il numero desiderato. Ad esempio, 2 ti darà il secondo stipendio più grande.

Se si utilizza PL / SQL, è sufficiente eseguire la dichiarazione. Richiederà N.

Prova questo:

 SELECT DISTINCT TOP 3 id,[Password] FROM Users_changepassword WHERE [UserId] = 3 ORDER BY id DESC 

Prova questo,

 SELECT Sal FROM Tab ORDER BY Sal DESC LIMIT 2,1 

Puoi provare questo sql dove viene utilizzata la funzione Row_number () di Oracle Oracle

 select column_name from ( select column_name , row_number() over (order by column_name desc) as row_num from table_Name ) tablex where row_num =3 
 SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee) 

Puoi utilizzare CONNECT BY PRIOR di:

 CREATE TABLE t(i INT, sal INT); INSERT INTO t(i, sal) SELECT 1,100 FROM dual UNION SELECT 2,100 FROM dual UNION SELECT 3,200 FROM dual UNION SELECT 4,500 FROM dual UNION SELECT 5,1000 FROM dual; 

Query:

 SELECT level, MAX(sal) AS sal FROM t --WHERE level = 2 -- set position here CONNECT BY prior sal > sal GROUP BY level ORDER BY level; 

Demo di DBFiddle

DBFiddle Demo2


MODIFICARE:

Il secondo approccio consiste nell’utilizzare la funzione analitica NTH_VALUE :

 SELECT DISTINCT NTH_VALUE(sal, 2) OVER(ORDER BY sal DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t; 

DBFiddle Demo3