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.
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)
SELECT * de l'employé WHERE Salaire IN (SELECT MAX (Salaire) DE Employé WHERE Salaire PAS IN (SELECT MAX (Salaire) Employé FFROM));
Essayez comme ça ..
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
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).
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;
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;
select MAX(Salary) from Employee WHERE Salary NOT IN (select MAX(Salary) from Employee );
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.
Par analyse manuelle, nous pouvons décider des rangs comme suit: -
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
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;
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)
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.
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
)
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
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;
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
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)
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);
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
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
SELECT *
FROM TABLE1 AS A
WHERE NTH HIGHEST NO.(SELECT COUNT(ATTRIBUTE) FROM TABLE1 AS B) WHERE B.ATTRIBUTE=A.ATTRIBUTE;
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
)
SELECT name
FROM employee
WHERE salary =
(SELECT MIN(salary)
FROM (SELECT TOP (2) salary
FROM employee
ORDER BY salary DESC) )
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 ;
SELECT `salary` AS emp_sal, `name` , `id`
FROM `employee`
GROUP BY `salary` ORDER BY `salary` DESC
LIMIT 1 , 1
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)
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
)
);
Une compilation de quatre solutions au problème:
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é)
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
SELECT name, salary FROM Employee e WHERE 2=(SELECT COUNT(DISTINCT salary) FROM Employee p WHERE e.salary<=p.salary)
;WITH T AS
(
SELECT *, DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk
FROM Employees
)
SELECT Name
FROM T
WHERE Rnk=2;
- 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 )
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 ))
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 ........
Je pense que c'est probablement le plus simple du lot.
SELECT Name FROM Employees group BY Salary DESCENDING limit 2;
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;
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
SELECT
salary
FROM
Employee
ORDER BY
salary DESC
LIMIT 1,
1;
Voici une approche simple:
select name
from employee
where salary=(select max(salary)
from(select salary from employee
minus
select max(salary) from employee));
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;
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
SELECT MAX(Salary) FROM Employee
WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)
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
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
);
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
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
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))**