Comment trouver le Nème salaire le plus élevé dans un tableau contenant les salaires dans SQL Server?
Vous pouvez utiliser une expression de table commune (CTE) pour obtenir la réponse.
Disons que vous avez 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 utiliserons:
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
Cela créera un numéro de ligne pour chaque ligne après son tri par ordre décroissant selon le salaire, 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 de CTE (ou qui sont bloqués dans SQL 2000):
[Note: sa performance est nettement inférieure à celle de l'exemple ci-dessus. leur exécution côte à côte avec un plan d’excursion montre un coût de requête de 36% pour le CTE et de 64% pour la sous-requête]:
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 entre parenthèses.
La sous-requête sélectionne les N salaires les plus élevés (nous allons dire 3 dans ce cas) et les commande en fonction du salaire le plus élevé.
Si nous voulons voir le troisième salaire le plus élevé, la sous-requête renverrait:
Salary
-----------
80,000
72,000
50,000
La requête externe sélectionne ensuite le premier salaire de la sous-requête, sauf que nous le trions par ordre croissant, du plus petit au plus élevé, de sorte que 50 000 serait le premier enregistrement trié par ordre croissant.
Comme vous pouvez le constater, 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 42ème salaire le plus élevé:
select *
from (
select row_number() over (order by Salary desc) as rn
, *
from YourTable
) as Subquery
where rn = 42
Les fonctions fenêtrées telles que row_number
peuvent uniquement apparaître dans les clauses select
ou order by
. La solution de contournement consiste à placer le row_number
dans une sous-requête.
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 souhaitiez obtenir le 5ème salaire le plus élevé, ce qui signifie qu'il y a au total 4 employés dont le salaire est supérieur au 5ème employé le plus élevé. Ainsi, pour chaque ligne de la requête externe, vérifiez le nombre total de salaires supérieurs au salaire actuel. La requête externe fonctionnera pour 100 en premier et vérifiera le nombre de salaires supérieur à 100. Il sera égal à 6; ne correspond pas à (5-1) = 6
où clause de outerquery. Ensuite, pour 800, et vérifiez le nombre de salaires supérieurs à 800, 4=0
false, puis travaillez pour 300 et enfin, il y a au total 4 enregistrements dans la table qui sont supérieurs à 300. Par conséquent, 4=4
respectera la clause where et renverra 3 C 300
.
essayez-le ...
use table_name
select MAX(salary)
from emp_salary
WHERE marks NOT IN (select MAX(marks)
from student_marks )
N'oubliez pas d'utiliser le mot clé distinct
: -
SELECT TOP 1 Salary
FROM
(
SELECT Distinct TOP N Salary
FROM Salaries
ORDER BY Salary DESC
) SalarySubquery
ORDER BY Salary ASC
Manière simple, SANS utiliser aucune fonction spécifique à Oracle, MySQL, etc., etc. Supposons que la table EMPLOYEE permet de répéter les salaires . Utilisez la requête pour connaître le classement 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
Nous découvrons d’abord des salaires distincts. Ensuite, nous découvrons le nombre de salaires distincts supérieurs à chaque rangée. Ce n'est rien mais le rang de cet identifiant. Pour le salaire le plus élevé, ce nombre sera égal à zéro. Donc '+1' est fait pour commencer le rang à partir de 1.
Nous pouvons maintenant obtenir les identifiants au nième rang en ajoutant la clause where à 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;
Solution 1: Ce code SQL pour trouver le nième salaire le plus élevé devrait fonctionner dans SQL Server, MySQL, DB2, Oracle, Teradata et presque tous les autres SGBDR: (remarque: performances médiocres du fait de la sous-requête)
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 car celle-ci utilise également la valeur Emp1.
Afin de trouver le Nème salaire le plus élevé, nous trouvons simplement le salaire qui a exactement N-1 salaires supérieurs à lui-même.
Solution 2: Trouvez le nième salaire le plus élevé en utilisant le mot clé TOP dans 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: Trouvez 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 code SQL ci-dessus, et je pense que cela ne fonctionnera que dans SQL Server 2012 et versions ultérieures.
SELECT * FROM
(select distinct postalcode from Customers order by postalcode DESC)
limit 4,1;
4 signifie ici laisser les 4 premiers et montrer le 1 suivant.
Essayez ceci cela fonctionne pour moi.
La méthode la plus simple consiste à obtenir 2nd higest salary
de table
dans SQL
:
sql> select max(sal) from emp where sal not in (select max(sal) from emp);