web-dev-qa-db-fra.com

Requête SQL pour trouver le Nème salaire le plus élevé à partir d'une table de salaires

Comment trouver le Nème salaire le plus élevé dans un tableau contenant les salaires dans SQL Server?

24
NoviceToDotNet

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.

33

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.

12
Andomar
select MIN(salary) from (
select top 5 salary from employees order by salary desc) x
6
Mayank
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 .

4
Rajiv Saxena

essayez-le ...

use table_name
select MAX(salary)
from emp_salary
WHERE marks NOT IN (select MAX(marks)
from student_marks )
2
Himanshu Namdeo

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
1
Hassan Arafat

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;
1
Kaushik Lele

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.

1
Zinan Xing
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.

0
Saif Grover

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);
0
Sonu Yadav