Comment trouver le troisième ou le nième salaire maximum à partir du tableau des salaires?

Réponses:

82

Utilisez ROW_NUMBER(si vous en voulez un seul) ou DENSE_RANK(pour toutes les lignes associées):

WITH CTE AS
(
    SELECT EmpID, EmpName, EmpSalary,
           RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
    FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow
Tim Schmelter
la source
comment obtenir l'enregistrement de salaire minimum de la table? sélectionnez ins.KYS_ID, ins.FKYS_INS_ID dans cmn_pat_x_insurance ins où ins.FKYS_PAT_ID = '1253_717' et ins.FKYS_INS_TYPE dans (1) et ins.BOL_TYPE dans (1,3) et ins.salary dans (min (ins.salary))
saidesh kilaru
Imaginez, il y a 10 0000 enregistrements dans la table des employés. Si j'utilise la requête ci-dessus, les performances seront réduites de 6 à 10 fois.
Bimal Das
1
@BimalDas: alors vous n'avez pas d'index sur la EmpSalarycolonne. Aussi, réduit par rapport à quoi? L'avantage de l' ROW_NUMBERapproche est que vous pouvez l'utiliser ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn). Vous pouvez donc l'utiliser pour obtenir des groupes tout en accédant à n'importe quelle colonne.
Tim Schmelter
@TimSchmelter WITH CTE créera une table temporaire pour y stocker les données entières de la première instruction SELECT, puis à partir du résultat, nous sélectionnons "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow". C'est pourquoi je suppose que c'est un peu lent. Je l'ai vérifié. et j'ai aussi une bonne indexation.
Bimal Das
2
@BimalDas: Non, cela ne crée pas de table temporaire. Un cte n'est normalement matérialisé nulle part. Cela ressemble plus à une vue en ligne ou à une sous-requête nommée.
Tim Schmelter
88

Numéro de ligne:

SELECT Salary,EmpName
FROM
  (
   SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
   FROM EMPLOYEE
   ) As A
WHERE A.RowNum IN (2,3)

Requête secondaire:

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
               SELECT COUNT(DISTINCT(Emp2.Salary))
               FROM Employee Emp2
               WHERE Emp2.Salary > Emp1.Salary
               )

Top mot-clé:

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary
Kumar Manish
la source
comment obtenir l'enregistrement de salaire minimum de la table? sélectionnez ins.KYS_ID, ins.FKYS_INS_ID dans cmn_pat_x_insurance ins où ins.FKYS_PAT_ID = '1253_717' et ins.FKYS_INS_TYPE dans (1) et ins.BOL_TYPE dans (1,3) et ins.salary dans (min (ins.salary))
saidesh kilaru
Kumar et Alexander, je veux obtenir un champ de plus, comment faire? ma requête est comme "" "Sélectionnez Top 1 NoteID De (Sélectionnez DateDiff (Year, SchedualDate, Current_TimeStamp) comme NoteAge, Distinct Top 3 NoteID De [dbo]. [DocSecheduale] Trier par NoteID Desc) a Trier par NoteID" ""
Zaveed Abbasi
Je trouve le nième salaire le plus élevé, mais je gagne en complexité pour comprendre la sous-requête, souhaitez-vous expliquer la sous-requête ...
Deepak Gupta
@deepak_java 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 la requête interne utilise également la valeur Emp1.
Kumar Manish
Il est important de comprendre pourquoi les ... WHERE (N-1) = (Subquery)...travaux. La sous-requête est une requête corrélée puisque sa WHEREclause utilise Emp1de la requête principale. La sous-requête est évaluée chaque fois que la requête principale analyse une ligne. Exemple, si nous devons trouver le 3ème salaire le plus élevé (N = 3) à partir de (800, 1000, 700, 750), la sous-requête de la 1ère ligne sera SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800égale à 0. Pour la 4ème valeur de salaire (750) ... WHERE Emp2.Salary > 750sera 2, ou N -1, donc cette ligne sera retournée.
jerrymouse
65

Essaye ça

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM employees 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

Pour 3, vous pouvez remplacer n'importe quelle valeur ...

Codesen
la source
est-ce que cela fonctionne avec oracle 10g ou 11g? Ou y a-t-il une alternative qui est assez comme ça?
RBz
40

Si vous voulez optimiser la manière, utilisez le TOPmot-clé, donc la nième requête sur les salaires maximum et minimum comme suit, mais les requêtes semblent difficiles comme dans l'ordre inverse en utilisant des noms de fonction d'agrégation:

N salaire maximum:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

pour Ex: 3 salaire maximum:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

N salaire minimum:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)

pour Ex: 3 salaire minimum:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Rajesh Pathakoti
la source
Le plus simple et le plus facile à retenir. +1
Sнаđошƒаӽ
4
pour obtenir le salaire maximum pourquoi nous faisons dans l'ordre ASC, cela doit être fait dans l'ordre DESC, si nous avons un salaire comme celui-ci 7000,10000,11000,500,800,900,12000, alors la requête interne de tri se traduira par top3 ce qui signifie 500.800.900 et le maximum de ceux-ci est de 900, mais 900 n'est pas le 3 maximum, le salaire maximum de 3 est de 10000.
Narendra Jaggi
1
pour Ex: 3 salaires maximums: Cela doit être comme ça SELECT Min (EmpSalary) FROM Salary WHERE EmpSalary IN (SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Jimit Rupani
15

Trop simple si vous utilisez la sous-requête!

SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);

Vous pouvez ici simplement modifier la nième valeur après la contrainte LIMIT.

Ici, la sous-requête Sélectionnez EmpSalary à partir de la commande des employés par EmpSalary DESC Limit 3; retournerait les 3 meilleurs salaires des employés. À partir du résultat, nous choisirons le salaire minimum en utilisant la commande MIN pour obtenir le 3ème salaire TOP de l'employé.

anonxss
la source
Obtenir cette erreur. Code d'erreur: 1248 Chaque table dérivée doit avoir son propre alias
ajoutez-y un alias. SELECT MIN (EmpSalary) de (SELECT EmpSalary de Employee ORDER BY EmpSalary DESC LIMIT 3) comme s;
anonxss
Utilisez simplement DISTINCT pour éviter les doublons SELECT MIN (EmpSalary) de (SELECT DISTINCT (EmpSalary) from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh
14

Remplacez N par votre nombre maximum

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

Explication

La requête ci-dessus peut être assez déroutante si vous n'avez rien vu de tel auparavant - la requête interne est ce qu'on appelle une sous-requête corrélée car la requête interne (la sous-requête) utilise une valeur de la requête externe (dans ce cas, la table Emp1 ) dans sa clause WHERE.

Et source

Luv
la source
+1 Il est important de comprendre pourquoi les ... WHERE (N-1) = (Subquery)...travaux. La sous-requête est une requête corrélée puisque sa WHEREclause utilise Emp1de la requête principale. La sous-requête est évaluée chaque fois que la requête principale analyse une ligne. Exemple, si nous devons trouver le 3ème salaire le plus élevé (N = 3) à partir de (800, 1000, 700, 750), la sous-requête de la 1ère ligne sera SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800égale à 0. Pour la 4ème valeur de salaire (750) ... WHERE Emp2.Salary > 750sera 2, ou N -1, donc cette ligne sera retournée.
jerrymouse
13

Troisième ou nième salaire maximum de la table des salaires sans utiliser de sous-requête

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

Pour le 3e salaire le plus élevé, mettez 2 à la place de N-1

Darvi Sunny
la source
3
Il est important de mentionner que OFFSET FETCH est disponible à partir de la version SQL Server 2012 +.
Zerotoinfinity
11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Pankaj Gaikwad
la source
1
Merci pour DENSE_RANK () je n'en ai jamais entendu parler
Vivekh
8

Reportez-vous à la requête suivante pour obtenir le nième salaire le plus élevé. De cette façon, vous obtenez le nième salaire le plus élevé de MYSQL. Si vous souhaitez obtenir le nième salaire le plus bas, vous devez remplacer DESC par ASC dans la requête. nième salaire le plus élevé

Vijay Bhatt
la source
1
La question concerne SQL-Server et non MySQL.
bummi
8
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Saurabh Chandra Patel
la source
6

Méthode 1:

SELECT TOP 1 salary FROM (
SELECT TOP 3 salary 
 FROM employees 
  ORDER BY salary DESC) AS emp 
 ORDER BY salary ASC

Méthode 2:

  Select EmpName,salary from
  (
    select EmpName,salary ,Row_Number() over(order by salary desc) as rowid      
     from EmpTbl)
   as a where rowid=3

la source
La méthode 1 peut être triée: SELECT TOP 1 SALARY FROM (SELECT TOP 3 SALARY OF EMPLOYEES) * reason- parce que par défaut son ordre croissant
Ashish Agrawal Yodlee
5

En 2008, nous pouvons utiliser ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) pour obtenir un rang sans égalité que nous pouvons utiliser.

Par exemple, nous pouvons obtenir le 8ème plus haut de cette façon, ou changer @N en autre chose ou l'utiliser comme paramètre dans une fonction si vous le souhaitez.

DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;

Dans SQL Server 2012, comme vous le savez peut-être, cela est effectué de manière plus intuitive à l'aide de LAG ().

David Söderlund
la source
4
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal
Uma Shankar Lakhera
la source
Potentiellement changer l'impression pour sélectionner
Tomas Pastircak
3

C'est l'une des questions les plus fréquentes dans toute interview SQL. Je vais écrire différentes requêtes pour connaître la nième valeur la plus élevée d'une colonne.

J'ai créé une table nommée «Emloyee» en exécutant le script ci-dessous.

CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)

Maintenant, je vais insérer 8 lignes dans ce tableau en exécutant ci-dessous une instruction d'insertion.

insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)

Nous allons maintenant trouver le 3e Basic_sal le plus élevé du tableau ci-dessus en utilisant différentes requêtes. J'ai exécuté la requête ci-dessous dans le studio de gestion et ci-dessous est le résultat.

select * from Employee order by Basic_Sal desc

Nous pouvons voir dans l'image ci-dessus que le 3e salaire de base le plus élevé serait de 8500. J'écris 3 façons différentes de faire la même chose. En exécutant les trois requêtes mentionnées ci-dessous, nous obtiendrons le même résultat, soit 8500.

Première manière: - Utilisation de la fonction de numéro de ligne

select Ename,Basic_sal
from(
            select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
      )A
where rowid=2
Neeraj Kumar Yadav
la source
3
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;

Je montre le 3e salaire le plus élevé

Kiran Lanke
la source
3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'
Vikas Joshi
la source
3

--nième salaire le plus élevé

select * 
from (select lstName, salary, row_number() over( order by salary desc) as rn 
      from employee) tmp
where rn = 2

- (nième -1) salaire le plus élevé

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )
Surya-AIS
la source
3

Méthode optimisée: au lieu de sous-requête, utilisez simplement limit.

select distinct salary from employee order by salary desc limit nth, 1;

Voir la syntaxe des limites ici http://www.mysqltutorial.org/mysql-limit.aspx

Kishor Vitekar
la source
Ouais! c'est une solution très simple et propre.
Avnish alok le
3

Pour obtenir la troisième valeur la plus élevée de la table

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
jitendra rajput
la source
SELECT Distinct columnName FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Devendra Singraul
2

Par sous-requête:

SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Sakib Ahammed
la source
1

Essayez cette requête

SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary) 
FROM emp WHERE E.salary <= salary)

Mettez n = quelle valeur vous voulez

Mayur Sawant
la source
1
set @n = $n

SELECT a.* FROM ( select a.* , @rn = @rn+1  from EMPLOYEE order by a.EmpSalary desc ) As a  where rn = @n
Saurabh Chandra Patel
la source
1

Solution testée par MySQL, supposons N = 4:

select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;

Un autre exemple:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);
Charlie
la source
1

Essayez ce code: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )
Deepak Kumar
la source
1
select * from employee order by salary desc;

+------+------+------+-----------+
| id   | name | age  | salary    |
+------+------+------+-----------+
|    5 | AJ   |   20 | 100000.00 |
|    4 | Ajay |   25 |  80000.00 |
|    2 | ASM  |   28 |  50000.00 |
|    3 | AM   |   22 |  50000.00 |
|    1 | AJ   |   24 |  30000.00 |
|    6 | Riu  |   20 |  20000.00 |
+------+------+------+-----------+




select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);

Remplacez n par le nième salaire le plus élevé comme nombre.

Ajay Singh Meena
la source
0

Essaye celui-là...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
Deepak Kumar
la source
0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

Pour le 2ème salaire le plus élevé, remplacez 3 par 2 dans la requête ci-dessus et pour le Nème salaire le plus élevé en N où N = 1,2,3,4 ....

apprenant
la source
0

SELECT * FROM (sélectionnez le salaire distinct des clients par ordre de salaire DESC) limite 4,1;

Limiter 4,1 signifie laisser les 4 premières lignes, puis sélectionner la suivante.

La limite et le nombre de rang dépendent de la plate-forme que vous utilisez.

Essayez ceci, cela fonctionnera.

Saif Grover
la source
0

REMARQUE: veuillez remplacer OFFSET 3 dans la requête par TOUT Nième nombre entier

SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS 
FETCH NEXT 1 ROWS ONLY

La description

RECHERCHEZ UNIQUEMENT LES 1 RANGÉES SUIVANTES

retourne seulement 1 ligne

OFFSET 3 RANGÉES

exclure les 3 premiers enregistrements Ici vous pouvez vous n'importe quel nombre entier

Hardik Masalawala
la source
0

Les sous-requêtes prennent toujours plus de temps:

utilisez la requête ci-dessous pour obtenir les données les plus élevées et les plus basses:

Données les plus élevées: select *from business order by id desc limit 3,1;

Données les plus basses: select *from business order by id asc limit 3,1;

Peut utiliser N à la place de 3 pour obtenir des nièmes données.

Ankit Gupta
la source