web-dev-qa-db-fra.com

Comment obtenir la deuxième plus grande ou la troisième plus grande entrée d'une table

Quelqu'un peut-il me dire s'il vous plaît comment trouver la N ème entrée la plus grande d'un tableau dans Oracle?

Comme pour le plus grand, nous pouvons utiliser MAX (nom_colonne) existe-t-il un moyen efficace de trouver n plus grand aussi ?

11
Ninja
 SELECT * 
 FROM (
 SELECT quelque_colonne, 
 Row_number () sur (ordre de your_sort_column desc) sous le nom row_num 
 FROM quelque_table 
) t 
 WHERE row_num = 3 


Si vous vous attendez à ce que plusieurs lignes aient la même valeur dans your_sort_column, vous pouvez également utiliser la fonction rank ()

 SELECT * 
 FROM (
 SELECT une colonne, 
 Rank () sur (ordre de votre colonne colonne_sort) comme row_rank 
 FROM une table 
) t 
 WHERE row_rank = 3 
Cela peut retourner plus d'une ligne ..

19

vous pouvez trouver la nième plus grande valeur de colonne en utilisant la requête suivante

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

Je pense que la requête ci-dessous fonctionnera pour trouver le deuxième enregistrement le plus élevé avec NOT IN.

SELECT MAX( userId) FROM table WHERE userId NOT IN (SELECT MAX (userId) FROM table) </ code>

simple et utile ...

4
prakash

Cela fonctionne pour le deuxième salaire le plus élevé, 

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

Pour obtenir le deuxième plus gros salaire, utilisez ceci:

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
1
Sanjeev Yadav
SELECT DISTINCT (a.sal) FROM EMP A WHERE &N = (
  SELECT COUNT (DISTINCT (b.sal)) FROM EMP B WHERE a.sal<=b.sal
);

Remplacez &N par le numéro souhaité. Par exemple, 2 vous donnera le deuxième salaire en importance.

Si vous utilisez PL/SQL, exécutez simplement l’instruction. Il va demander pour N.

0
Kishore Kumar

Essaye ça: 

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

Vous pouvez essayer ce sql où la fonction Row_number () de Oracle SQL est utilisée 

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
0
UserszrKs
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)
0
Piyush

Vous pouvez utiliser CONNECT BY PRIOR en:

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;

Question:

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;

DBFiddle Demo

DBFiddle Demo2


EDIT:

La deuxième approche consiste à utiliser la fonction analytique NTH_VALUE:

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

DBFiddle Demo3

0
Lukasz Szozda

Essaye ça, 

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

Vous pouvez ORDER BY column name puis LIMIT 1,1 pour obtenir le second

modifier

Oups, n'a pas vu la balise Oracle, désolé.
ORDER BY column name WHERE ROWNUM = 2 devrait mieux fonctionner.

0
Agos