Requête SQL pour find les premier, deuxième et troisième nombres les plus élevés

Qu'est-ce qu'un exemple de requête pour récupérer le premier, deuxième et troisième plus grand nombre d'une table de database à l'aide de SQL Server?

Vous pouvez sortinger par votre valeur en descendant et prendre le top 3.

SELECT TOP 3 YourVal FROM YourTable ORDER BY YourVal DESC 

Ou si vous vouliez séparer chaque résultat,

premier numéro:

 SELECT TOP 1 YourVal FROM YourTable ORDER BY YourVal DESC 

deuxième numéro:

 SELECT TOP 1 YourVal FROM YourTable WHERE YourVal not in (SELECT TOP 1 YourVal FROM YourTable ORDER BY YourVal DESC) ORDER BY YourVal DESC 

troisième numéro:

 SELECT TOP 1 YourVal FROM YourTable WHERE YourVal not in (SELECT TOP 2 YourVal FROM YourTable ORDER BY YourVal DESC) ORDER BY YourVal DESC 

en supposant que YourVal est unique


EDIT: suivi du commentaire OP

pour get la nième valeur, select le TOP 1 qui n'est pas dans le TOP (n-1), donc cinquième peut être choisi par:

 SELECT TOP 1 YourVal FROM YourTable WHERE YourVal not in (SELECT TOP 4 YourVal FROM YourTable ORDER BY YourVal DESC) ORDER BY YourVal DESC 

La SELECT TOP n ... ORDER BY key proposée fonctionnera mais vous devez être conscient du fait que vous pourriez get des résultats inattendus si la colonne sur laquelle vous sortingez n'est pas unique. Trouvez plus d'informations sur le sujet ici .

Sudhakar,

Il peut être plus facile d'utiliser ROW_NUMBER () ou DENSE_RANK () pour certaines de ces questions. Par exemple, pour find YourVal et d'autres colonnes de la cinquième ligne dans l'ordre de YourVal DESC:

 WITH TRanked AS ( SELECT *, ROW_NUMBER() OVER ( ORDER BY YourVal DESC, yourPrimaryKey ) AS rk ) SELECT YourVal, otherColumns FROM TRanked WHERE rk = 5; 

Si vous voulez toutes les lignes avec la cinquième plus grande valeur distincte YourVal, changez simplement ROW_NUMBER () en DENSE_RANK ().

Un très gros avantage de ces fonctions est le fait que vous pouvez immédiatement changer une requête "le nième plus haut YourVal" en une requête "le nième plus haut YourVal pour chaque autre colonne " en ajoutant simplement PARTITION BY otherColumn à la clause OVER.

Dans certains packages de SGBD, la command top peut ne pas fonctionner. Alors comment faire cela? Supposons que nous devions find le troisième salaire le plus élevé dans la table des employés. Nous sélectionnons donc le salaire distinct de la table dans l'ordre décroissant:

 select distinct salary from employee order by salary desc 

Maintenant, parmi les salaires sélectionnés, nous avons besoin des 3 meilleurs salaires, pour cela nous écrivons:

 select salary from (select distinct salary from employee order by salary desc) where rownum<=3 order by salary 

Cela donne les 3 meilleurs salaires dans l'ordre croissant. Cela fait le troisième plus gros salaire pour aller en première position. Maintenant nous avons la tâche finale d'imprimer le 3ème plus grand nombre.

 select salary from (select salary from (select distinct salary from employee order by salary desc) where rownum<=3 order by salary) where rownum=1 

Cela donne le troisième plus grand nombre. Pour toute erreur dans la requête s'il vous plaît faites le moi savoir. Pour get le nième plus grand nombre, nous pouvons réécrire la requête ci-dessus

 select salary from (select salary from (select distinct salary from employee order by salary desc) where rownum<=**n** order by salary) where rownum=1 

Si vous avez une table appelée Orders et 3 colonnes Id, ProductId et Quantity, alors pour récupérer les 3 premières quantités les plus élevées, votre requête devrait ressembler à ceci:

 SELECT TOP 3 [Id], [ProductId], [Quantity] FROM [Orders] ORDER BY [Quantity] DESC 

ou si vous voulez juste la colonne quantité:

 SELECT TOP 3 [Quantity] FROM [Orders] ORDER BY [Quantity] DESC 

Cela fonctionne préfet!

 select top 1 * from Employees where EmpId in ( select top 3 EmpId from Employees order by EmpId ) order by EmpId desc; 

Si vous souhaitez get le 2ème, 3ème ou 4ème plus haut, il suffit de changer top3 au nombre approprié.