Requête SQL pour trouver nième salaire le plus élevé d'une table de salaire
Comment puis-je trouver le nième salaire le plus élevé dans une table contenant les salaires dans SQL Server?
11 réponses
vous pouvez utiliser une Expression commune de Table (CTE) pour obtenir la réponse.
supposons que vous ayez les salaires suivants dans la table salaires:
EmployeeID Salary
--------------------
10101 50,000
90140 35,000
90151 72,000
18010 39,000
92389 80,000
Nous allons utiliser:
DECLARE @N int
SET @N = 3 -- Change the value here to pick a different salary rank
SELECT Salary
FROM (
SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary
FROM Salaries
) as SalaryCTE
WHERE SalaryRank = @N
ceci créera un numéro de ligne pour chaque ligne après qu'elle ait été triée par le salaire en ordre décroissant, puis récupérera la troisième ligne (qui contient le troisième enregistrement le plus élevé).
pour ceux d'entre vous qui ne veulent pas D'un CTE (ou qui sont coincés dans SQL 2000):
[Remarque:: ceci fonctionne nettement moins bien que l'exemple ci-dessus; les exécuter côte à côte avec un plan de dépassement montre un coût de requête de 36% pour le CTE et de 64% pour le sousquery]:
SELECT TOP 1 Salary
FROM
(
SELECT TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
où N est défini par vous.
SalarySubquery
est l'alias que j'ai donné à la sous-requête, ou la requête qui est parenthèses.
ce que le subquery fait, c'est qu'il sélectionne les n meilleurs salaires (nous dirons 3 dans ce cas), et les commandes par le plus grand salaire.
si nous voulons voir le troisième salaire le plus élevé, la sous-requête retournerait:
Salary
-----------
80,000
72,000
50,000
la requête externe sélectionne alors le premier salaire du sous-jeu, sauf que nous le trions en croissant cette fois, qui trie de plus en plus petit, donc 50 000 serait le premier enregistrement trié ascendant.
comme vous pouvez le voir, 50 000 est en effet le troisième salaire le plus élevé dans l'exemple.
Vous pouvez utiliser row_number
pour choisir une ligne spécifique. Par exemple, le 42e salaire le plus élevé:
select *
from (
select row_number() over (order by Salary desc) as rn
, *
from YourTable
) as Subquery
where rn = 42
fonctions fendues comme row_number
ne peut apparaître que dans select
ou order by
les clauses. La solution de contournement est de placer le row_number
dans un subquery.
select MIN(salary) from (
select top 5 salary from employees order by salary desc) x
EmpID Name Salary
1 A 100
2 B 800
3 C 300
4 D 400
5 E 500
6 F 200
7 G 600
SELECT * FROM Employee E1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(E2.Salary))
FROM Employee E2
WHERE E2.Salary > E1.Salary
)
supposons que vous voulez trouver le 5e salaire le plus élevé, ce qui signifie qu'il y a un total de 4 employés qui ont un salaire supérieur au 5e employé le plus élevé. Ainsi, pour chaque ligne de la requête externe, cochez le nombre total de salaires qui sont supérieurs au salaire actuel. La requête externe fonctionnera d'abord pour 100 et vérifiera le nombre de salaires supérieurs à 100. Il sera 6, ne correspondent pas (5-1) = 6
où est la clause d'outerquery? Ensuite, pour 800, et vérifier le nombre de salaires supérieurs à 800,4=0
faux puis travailler pour 300 et finalement il ya tout à fait 4 enregistrements dans le tableau qui sont plus de 300. Donc 4=4
respectera la clause " où " et retournera
3 C 300
.
essayez...
use table_name
select MAX(salary)
from emp_salary
WHERE marks NOT IN (select MAX(marks)
from student_marks )
manière Simple sans utiliser aucune fonctionnalité spécifique à Oracle, MySQL, etc. Supposons que dans la table des employés les salaires peuvent être répétés. Utilisez la requête pour trouver le rang de chaque ID.
select *
from (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from
EMPLOYEE ) where distsal >tout.sal) as rank from EMPLOYEE tout
) result
order by rank
maintenant nous pouvons obtenir des ID au nième rang en ajoutant où clause à la requête ci-dessus.
select *
from (
select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from
EMPLOYEE ) where distsal >tout.sal) as rank from EMPLOYEE tout
) result
where rank = N;
N'oubliez pas d'utiliser le distinct
mot clé:-
SELECT TOP 1 Salary
FROM
(
SELECT Distinct TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
Solution 1: Ce SQL pour trouver le nième salaire le plus élevé devrait fonctionner dans SQL Server, MySQL, DB2, Oracle, Teradata, et presque tous les autres RDBMS: (note: faible performance en raison de la sous-commande)
SELECT * /*This is the outer query part */
FROM Employee Emp1
WHERE (N-1) = ( /* Subquery starts here */
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
la chose La plus importante à comprendre dans la requête ci-dessus est que la sous-requête est évaluée chaque fois qu'une ligne est traitée par la requête externe. En d'autres termes, la requête interne ne peut pas être traitée indépendamment de la requête externe puisque la requête interne utilise la valeur Emp1 aussi.
afin de trouver le nième salaire le plus élevé, nous trouvons juste le salaire qui a exactement n-1 salaires supérieurs à lui-même.
Solution 2: trouver le nième salaire le plus élevé en utilisant le mot-clé en haut de SQL Server
SELECT TOP 1 Salary
FROM (
SELECT DISTINCT TOP N Salary
FROM Employee
ORDER BY Salary DESC
) AS Emp
ORDER BY Salary
Solution 3: trouver le nième salaire le plus élevé dans SQL Server sans utiliser TOP
SELECT Salary FROM Employee
ORDER BY Salary DESC OFFSET N-1 ROW(S)
FETCH FIRST ROW ONLY
notez que je n'ai pas personnellement testé le SQL ci-dessus, et je crois que cela ne fonctionnera qu'avec SQL Server 2012 et plus.
la méthode la plus facile est d'obtenir 2nd higest salary
table
SQL
:
sql> select max(sal) from emp where sal not in (select max(sal) from emp);
SELECT * FROM
(select distinct postalcode from Customers order by postalcode DESC)
limit 4,1;
4 ici signifie quitter le premier 4 et montrer le prochain 1.
essayez ceci, ça marche pour moi.
une requête très simple pour trouver nième salaire le plus élevé
SELECT DISTINCT(Sal) FROM emp ORDER BY Salary DESC LIMIT n,1