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?

24
demandé sur LittleBobbyTables 2010-10-03 17:58:48
la source

11 ответов

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.

33
répondu LittleBobbyTables 2014-09-11 22:59:02
la source

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.

12
répondu Andomar 2010-10-03 18:14:03
la source
select MIN(salary) from (
select top 5 salary from employees order by salary desc) x
6
répondu Mayank 2012-03-20 14:07:33
la source
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.

4
répondu Rajiv Saxena 2013-04-25 17:28:17
la source

essayez...

use table_name
select MAX(salary)
from emp_salary
WHERE marks NOT IN (select MAX(marks)
from student_marks )
2
répondu Himanshu Namdeo 2013-01-10 13:58:51
la source

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;
1
répondu Kaushik Lele 2012-11-16 09:25:54
la source

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
1
répondu Hassan Arafat 2013-04-02 10:41:20
la source

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.

1
répondu Zinan Xing 2014-02-05 22:49:41
la source

la méthode la plus facile est d'obtenir 2nd higest salarytableSQL:

sql> select max(sal) from emp where sal not in (select max(sal) from emp);
0
répondu Sonu Yadav 2013-03-19 09:57:16
la source
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.

0
répondu Saif Grover 2018-03-07 18:11:26
la source

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
-3
répondu deepakjoshi 2015-09-05 09:38:45
la source

Autres questions sur