web-dev-qa-db-fra.com

Comment obtenir les employés au deuxième rang des salaires dans une table

C'est une question que j'ai eu cet après-midi:

Dans cette table, une table contient l'ID, le nom et le salaire des employés, ainsi que le nom des employés ayant le deuxième salaire le plus élevé, dans SQL Server.

Voici ma réponse, je viens de l'écrire sur papier et je ne suis pas sûr que cela soit parfaitement valide, mais cela semble fonctionner: 

SELECT Name FROM Employees WHERE Salary = 
( SELECT DISTINCT TOP (1) Salary FROM Employees WHERE Salary NOT IN
 (SELECT DISTINCT TOP (1) Salary FROM Employees ORDER BY Salary DESCENDING)
ORDER BY Salary DESCENDING)

Je pense que c'est moche, mais c'est la seule solution qui me vienne à l'esprit.

Pouvez-vous me suggérer une meilleure requête?

Merci beaucoup.

33
Vimvq1987

Vous pouvez utiliser les noms des employés avec le deuxième montant de salaire distinct le plus élevé.

;WITH T AS
(
SELECT *,
       DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk
FROM Employees
)
SELECT Name
FROM T
WHERE Rnk=2;

Si le salaire est indexé, les éléments suivants pourraient être plus efficaces, surtout s’il ya beaucoup d’employés.

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT MIN(Salary)
                 FROM   (SELECT DISTINCT TOP (2) Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) T);

Script de test

CREATE TABLE Employees
  (
     Name   VARCHAR(50),
     Salary FLOAT
  )

INSERT INTO Employees
SELECT TOP 1000000 s1.name,
                   abs(checksum(newid()))
FROM   sysobjects s1,
       sysobjects s2

CREATE NONCLUSTERED INDEX ix
  ON Employees(Salary)

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT MIN(Salary)
                 FROM   (SELECT DISTINCT TOP (2) Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) T);

WITH T
     AS (SELECT *,
                DENSE_RANK() OVER (ORDER BY Salary DESC) AS Rnk
         FROM   Employees)
SELECT Name
FROM   T
WHERE  Rnk = 2;

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT DISTINCT TOP (1) Salary
                 FROM   Employees
                 WHERE  Salary NOT IN (SELECT DISTINCT TOP (1) Salary
                                       FROM   Employees
                                       ORDER  BY Salary DESC)
                 ORDER  BY Salary DESC)

SELECT Name
FROM   Employees
WHERE  Salary = (SELECT TOP 1 Salary
                 FROM   (SELECT TOP 2 Salary
                         FROM   Employees
                         ORDER  BY Salary DESC) sel
                 ORDER  BY Salary ASC)  
29
Martin Smith
 SELECT * de l'employé 
 WHERE Salaire IN (SELECT MAX (Salaire) 
 DE Employé 
 WHERE Salaire PAS IN (SELECT MAX (Salaire) 
 Employé FFROM));

Essayez comme ça ..

34
amateur

Cela pourrait vous aider

SELECT 
      MIN(SALARY) 
FROM 
      EMP 
WHERE 
      SALARY in (SELECT 
                      DISTINCT TOP 2 SALARY 
                 FROM 
                      EMP 
                 ORDER BY 
                      SALARY DESC
                )

Nous pouvons trouver le salaire le plus élevé de nth en mettant n (où n > 0) à la place de 2

Exemple pour 5th le salaire le plus élevé que nous avons mis n = 5

9
meekash55

Que diriez-vous d'un CTE?

;WITH Salaries AS
(
    SELECT Name, Salary,
       DENSE_RANK() OVER(ORDER BY Salary DESC) AS 'SalaryRank'
    FROM 
        dbo.Employees
)
SELECT Name, Salary
FROM Salaries  
WHERE SalaryRank = 2

DENSE_RANK() vous donnera tous les employés qui ont le deuxième salaire le plus élevé - peu importe combien d’employés ont le salaire le plus élevé (identique).

7
marc_s

Une autre méthode intuitive est la suivante: - Supposons que nous voulions trouver le n 

1) Trier l'employé selon l'ordre décroissant du salaire 

2) Prenez les premiers N enregistrements en utilisant rownum. Donc, dans cette étape, le Nième record est le Nième salaire le plus élevé

3) Maintenant, triez ce résultat temporaire par ordre croissant. Ainsi, le nième salaire le plus élevé est maintenant le premier record

4) Obtenir le premier enregistrement de ce résultat temporaire. 

Ce sera le nième salaire le plus élevé.

select * from 
 (select * from 
   (select * from  
       (select * from emp order by sal desc)  
   where rownum<=:N )  
 order by sal )
where rownum=1;

Dans le cas où les salaires se répètent, la requête la plus interne peut être utilisée. 

select * from 
 (select * from 
   (select * from  
       (select distinct(sal) from emp order by 1 desc)  
   where rownum<=:N )  
 order by sal )
where rownum=1;
5
Kaushik Lele

Toutes les requêtes suivantes fonctionnent pour MySQL :

SELECT MAX(salary) FROM Employee WHERE Salary NOT IN (SELECT Max(Salary) FROM Employee);

SELECT MAX(Salary) From Employee WHERE Salary < (SELECT Max(Salary) FROM Employee);

SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1;

SELECT Salary FROM (SELECT Salary FROM Employee ORDER BY Salary DESC LIMIT 2) AS Emp ORDER BY Salary LIMIT 1;
3
Pratik Patil
select MAX(Salary) from Employee WHERE Salary NOT IN (select MAX(Salary) from Employee );
3
steave

Manière simple, SANS utiliser aucune fonctionnalité spécifique à Oracle, MySQL, etc.

Supposons que la table EMPLOYEE ait les données ci-dessous. Les salaires peuvent être répétés. enter image description here

Par analyse manuelle, nous pouvons décider des rangs comme suit: -
enter image description here

Le même résultat peut être obtenu par requête

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

enter image description here

Nous découvrons d’abord des salaires distincts. Ensuite, nous découvrons le nombre de salaires distincts supérieurs à chaque ligne. Ce n'est rien mais le rang de cet id. 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 ID au rang N 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;
3
Kaushik Lele

La requête ci-dessous peut être utilisée pour trouver la nième valeur maximale, il suffit de remplacer 2 du nième nombre

select * from emp e1 where 2 =(select count(distinct(salary)) from emp e2
   where e2.emp >= e1.emp)
2
Gopal Sanodiya

Je pense que vous voudriez utiliser DENSE_RANK car vous ne savez pas combien d’employés ont le même salaire et vous avez dit que vous vouliez connaître le nom des employés.

CREATE TABLE #Test
(
    Id INT,
    Name NVARCHAR(12),
    Salary MONEY
)

SELECT x.Name, x.Salary
FROM
        (
        SELECT  Name, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) as Rnk
        FROM    #Test
        ) x
WHERE x.Rnk = 2

ROW_NUMBER vous donnerait une numérotation unique même si les salaires étaient égaux, et un simple RANK ne vous attribuerait pas le «2» comme rang si vous aviez plusieurs personnes se disputant le salaire le plus élevé. J'ai corrigé ceci car DENSE_RANK fait le meilleur travail pour cela.

2
ericb

Essayez ceci pour obtenir le nième salaire le plus élevé.

SELECT
    *
FROM
    emp e1
WHERE
    2 = (
        SELECT
            COUNT(salary)
        FROM
            emp e2
        WHERE
            e2.salary >= e1.salary
    )
1
Ajay
select max(age) from yd where age<(select max(age) from HK) ; /// True two table Highest 

SELECT * FROM HK E1 WHERE 1 =(SELECT COUNT(DISTINCT age) FROM HK E2 WHERE E1.age < E2.age); ///Second Hightest age RT single table 

select age from hk e1 where (3-1) = (select count(distinct (e2.age)) from yd e2 where e2.age>e1.age);//// same True Second Hight age RT two table

select max(age) from YD where age not in (select max(age) from YD);  //second hight age in single table 
1
H K RAO

Ici, j'ai utilisé deux requêtes pour les scénarios suivants qui sont posées lors d'une interview.
Premier scénario:
Trouver tous les seconds salaires les plus élevés dans le tableau (Deuxième salaires les plus élevés avec plus de Un employé) 

select * from emp where salary
   In (select MAX(salary) from emp where salary NOT IN (Select MAX(salary) from 
   emp));

Deuxième scénario:
Trouvez seulement le deuxième salaire le plus élevé dans le tableau 

select min(temp.salary) from (select * from emp order by salary desc limit 2) 
  temp;
1
Gobi

La plupart des réponses sont valables. Vous pouvez utiliser une compensation avec le salaire trié comme ci-dessous,

SELECT NAME
FROM EMPLOYEES
WHERE SALARY IN
(
    SELECT DISTINCT 
           SALARY
    FROM EMPLOYEES
    ORDER BY SALARY DESC
    OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
);

Pour trouver le nième salaire le plus élevé, remplacez la compensation 1 par n

1
Code_Mode

c’est la simple requête .. si vous voulez le deuxième minimum, changez simplement le max en min et changez le signe inférieur à (<) en plus grande que (>).

    select max(column_name) from table_name where column_name<(select max(column_name) from table_name)
1
anurag sethi

Si vous voulez afficher le nom de l'employé qui reçoit le deuxième salaire le plus élevé, utilisez ceci:

SELECT employee_name 
FROM employee
WHERE salary = (SELECT max(salary) 
                FROM employee
                WHERE salary < (SELECT max(salary) 
                                FROM employee);
1
Manjunath N Shetty

Peut-on aussi utiliser

select e2.max(sal), e2.name
from emp e2
where (e2.sal <(Select max (Salary) from empo el))
group by e2.name

S'il vous plaît laissez-moi savoir ce qui ne va pas avec cette approche

1
lakshmi

Essaye celui-là

    select * from
   (
    select name,salary,ROW_NUMBER() over( order by Salary desc) as
    rownum from    employee
   ) as t where t.rownum=2

http://askme.indianyouth.info/details/write-a-sql-query-tindfind-the-10th-highest-employee-salary-from-an-employee-table-explain-your-answer- 111

1
Harikesh Yadav
SELECT * 
FROM TABLE1 AS A 
WHERE NTH HIGHEST NO.(SELECT COUNT(ATTRIBUTE) FROM TABLE1 AS B) WHERE B.ATTRIBUTE=A.ATTRIBUTE;
1
PRASAD
select * from emp where salary = (  
    select salary from   
       (select ROW_NUMBER() over (order by salary) as 'rownum', *
        from emp) t -- Order employees according to salary  
    where rownum = 2 -- Get the second highest salary
)
1
sh_kamalh
SELECT name
FROM employee
WHERE salary =
(SELECT MIN(salary) 
  FROM (SELECT TOP (2) salary
  FROM employee
  ORDER BY salary DESC) )
1
Himalaya Garg

supposons que nous avons une table comme

name       salary
 A           10
 B           30
 C           20
 D           40

nous allons donc d'abord organiser par ordre décroissant: 40 30 20 10 

alors nous ne prendrons que les deux premiers numéros => 40 30

alors nous l'arrangerons par ordre croissant => 30 40

alors nous prendrons le premier nombre => 30

donc dans mysql ::

SELECT * FROM (SELECT  * FROM employee   order by salary DESC LIMIT 2) order by salary ASC LIMIT 1;

dans Oracle ::

SELECT * FROM (SELECT  * FROM employee  where rownum<=2 order by salary DESC )  where rownum<=1  order by salary ASC ;
0
Ritabrata Gautam
SELECT `salary` AS emp_sal, `name` , `id`
FROM `employee`
GROUP BY `salary` ORDER BY `salary` DESC
LIMIT 1 , 1 
0
mayurjadhav
SELECT MIN(a.sal) 
FROM dbo.demo a 
WHERE a.sal IN (SELECT DISTINCT TOP 2 a.sal 
                FROM dbo.demo a 
                ORDER BY a.sal DESC) 
0
pintu kumar panda

Cette requête affiche tous les détails des employés avec le deuxième salaire le plus élevé

SELECT
    *
FROM
    Employees
WHERE
    salary IN (
        SELECT
            max(salary)
        FROM
            Employees
        WHERE
            salary NOT IN (
                SELECT
                    max(salary)
                FROM
                    Employees
            )
    );
0
Somex Gupta

Une compilation de quatre solutions au problème: 

Première solution - Utiliser une requête secondaire

SELECT MAX (salaire) de Employé ---- Cette requête va vous donner le salaire maximum 

Maintenant, utilisez la requête ci-dessus comme sous-requête pour obtenir le prochain salaire le plus élevé, comme ci-dessous:

SELECT MAX(salary) FROM employee WHERE salary <> (SELECT MAX(salary) from Employee) - Cette requête vous donnera le deuxième salaire le plus élevé 

Maintenant, si vous voulez obtenir le nom du ou des employés obtenant le deuxième salaire le plus élevé, utilisez la requête ci-dessus comme sous-requête pour l'obtenir, comme ci-dessous 

SELECT name from employee WHERE salary = 
(SELECT MAX(salary) FROM employee WHERE salary <> (SELECT MAX(salary) from Employee)

- Cette requête va vous donner le deuxième salaire le plus élevé) 

Deuxième solution - Utilisation de la table dérivée

SELECT TOP 2 DISTINCT(salary) FROM employee ORDER BY salary DESC - Cela va vous donner deux plus hauts salaires. Ce que vous faites ici est de classer les salaires par ordre décroissant, puis de sélectionner les 2 meilleurs salaires. 

Maintenant, commandez le résultat ci-dessus dans l'ordre croissant du salaire et obtenez le TOP 1 

SELECT TOP 1 salary FROM
(SELECT TOP 2 DISTINCT(salary) FROM employee ORDER BY salary DESC) AS tab 
ORDER BY salary

Troisième solution - Utilisation d'une sous-requête corrélée

SELECT name, salary FROM Employee e WHERE 2=(SELECT COUNT(DISTINCT salary) FROM Employee p WHERE e.salary<=p.salary)

Quatrième solution - Utiliser la fonction de fenêtre

;WITH T AS
(
SELECT *, DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk
FROM Employees
)
SELECT Name
FROM T
WHERE Rnk=2;
0
Dipendu Paul
 - Method 1

    select max(salary) from Employees
        where salary< (select max(salary) from Employees)



 - Method 2

 select MAX(salary) from Employees 
    where salary not in(select MAX(salary) from Employees)



 - Method 3

select MAX(salary) from Employees 
    where salary!= (select MAX(salary) from Employees )
0
Tuscan
SELECT lastname, firstname
FROM employees
WHERE salary IN(
    SELECT MAX(salary) 
    FROM employees 
    WHERE salary < (SELECT MAX(salary) FROM employees));

Alors voici ce que le code mentionné ci-dessus fait:

Il renvoie les noms de famille suivis des prénoms des employés Les salaires sont inférieurs au salaire maximal de tous les employés, mais il s'agit également du salaire maximal des employés qui ne le sont pas.

En d'autres termes: Il renvoie les noms des employés qui ont le deuxième salaire maximum.

essayez ce moyen simple

select name,salary from employee where salary =
(select max(salary) from employee where salary < (select max(salary) from employee ))
0
Vilas Galave

Pour trouver le deuxième salaire le plus élevé ....

SELECT MAX( salary)  FROM tblEmp WHERE salary< ( SELECT MAX( salary) FROM tblEmp )

ou

SELECT max(salary) FROM tblEmp WHERE salary NOT IN (SELECT max(salary) FROM tblEmp)

où "salaire" est le nom de la colonne et tblEmp est le nom de la table ........

0
Durgesh Pandey

Je pense que c'est probablement le plus simple du lot.

SELECT Name FROM Employees group BY Salary DESCENDING limit 2;
0
Abhilash
declare

cntr number :=0;

cursor c1 is

select salary from employees order by salary desc;

z c1%rowtype;

begin

open c1;

fetch c1 into z;

while (c1%found) and (cntr <= 1) loop


cntr := cntr + 1;

fetch c1 into z;

dbms_output.put_line(z.salary);

end loop;

end;
0
Ashish sinha

Création de table temporaire 

Create Table #Employee (Id int identity(1,1), Name varchar(500), Salary int)

Insérer des données

Insert Into #Employee
    Select 'Abul', 5000
Union ALL 
    Select 'Babul', 6000
Union ALL 
    Select 'Kabul', 7000
Union ALL 
    Select 'Ibul', 8000
Union ALL 
    Select 'Dabul', 9000

La requête sera 

select top 1 * from #Employee a
Where a.id <> (Select top 1 b.id from #Employee b ORDER BY b.Salary desc)
order by a.Salary desc

Drop table 

drop table #Empoyee
0
amnippon
SELECT
    salary
FROM
    Employee
ORDER BY
    salary DESC
LIMIT 1,
 1;
0
Kiran

Voici une approche simple:

select name
from employee
where salary=(select max(salary)
              from(select salary from employee
                   minus
                   select max(salary) from employee));
0
Vikas Bansal

En utilisant ce code SQL, le deuxième salaire le plus élevé sera obtenu avec le nom de l'employé

Select top 1 start at 2 salary from employee group by salary order by salary desc;
0
Deepraj Shetty
select 
    max(salary) 
from 
    emp_demo_table 
where 
    salary < (select max(salary) from emp_demo_table)

J'espère que cela résout la requête en termes les plus simples.

Merci

0
Ash

j'ai un tableau comme celui-ci dans l'image ci-dessous, et je vais trouver le deuxième plus grand nombre dans la colonne "to_user" ..  enter image description here

Voici la réponse

sélectionnez MAX (to_user) FROM db.masterledger où to_user NOT IN (SELECT MAX (to_user) FROM db.masterledger);

0
Vignesh R
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)
0
Avinash Singh

Je veux poster ici éventuellement la solution la plus simple. Cela a fonctionné dans mysql.

S'il vous plaît vérifier à votre fin aussi:

SELECT name
FROM `emp`
WHERE salary = (
SELECT salary
FROM emp e
ORDER BY salary DESC
LIMIT 1
OFFSET 1 
0
user1981173

Essayez celui-ci pour MSSQL:

SELECT
    TOP 1 salary
FROM
    (
        SELECT
            TOP 2 salary
        FROM
            Employees 
    ) sal
ORDER BY
    salary DESC;

Mais vous devriez essayer cette requête SQL générique qui fonctionne pour tout type de base de données.

SELECT
    MAX(salary)
FROM
    Employee
WHERE
    Salary NOT IN (
        SELECT
            Max(Salary)
        FROM
            Employee
    );

OU

SELECT
    MAX(Salary)
FROM
    Employee
WHERE
    Salary < (
        SELECT
            Max(Salary)
        FROM
            Employee
    );
0
Faisal

pour le nième salaire le plus élevé. c'est facile

select t.name,t.sal
from (select name,sal,dense_rank() over (order by sal desc) as rank from emp) t
where t.rank=6; //suppose i find 6th highest salary
0
NAUSHAD AHAMAD

Essaye ça

select * from (
   select ROW_NUMBER() over (order by [salary] desc) as sno,emp_name,   
   [salary] from [dbo].[Emp]
) t 
where t.sno =10

with t as
select top (1) * from       
  (select top (2) emp_name,salary from   [Emp]  e
   order by  salary desc) t
order  by salary asc
0

Essayez ceci : Ceci donnera des résultats dynamiques indépendamment du nombre de lignes

SELECT * FROM emp WHERE salary = (SELECT max(e1.salary) 
FROM emp e1 WHERE e1.salary < (SELECT Max(e2.salary) FROM emp e2))**
0
Jyo