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é.