Database
 sql >> Base de données >  >> RDS >> Database

Nième salaire le plus élevé

La question la plus courante et la plus importante posée dans les entretiens est de savoir comment trouver le Nième salaire le plus élevé dans un tableau (2ème salaire le plus élevé, 3ème salaire le plus élevé ou Nième salaire le plus élevé), où N pourrait être 2, 3, 4, 5 ou n'importe quoi.

Chaque programmeur sait que le moyen le plus simple de trouver le n salaire le plus élevé consiste à utiliser SQL (Structured Query Language) dans une table.

Chaque fois que l'intervieweur vous pose une question sur le 2 salaire le plus élevé, le 4 salaire le plus élevé, etc., pour résoudre cette question, nous devons connaître certains concepts importants comme une sous-requête, une fonction à utiliser comme row_num (), Rank Rank () , etc.

Cet article vous permettra de connaître différentes façons de trouver le salaire le plus élevé N.

Considérez les tables existantes qui ont les enregistrements suivants :

Table :Employés

ID EMPLOYEE FIRST_NAME LAST_NAME SALAIRE VILLE DÉPARTEMENT MANAGERID
1001 VAIBHAVI MISHRA 65500 PUNE ORACLE 1
1002 VAIBHAV SHARMA 60000 NOÏDA C# 5
1003 NIKHIL VANI 50500 JAIPUR FMW 2
2001 PRACHI SHARMA 55500 CHANDIGAR ORACLE 1
2002 BHAVESH JAIN 65500 PUNE FMW 2
2003 RUCHIKA JAIN 50000 Bombay C# 5
3001 PRANOTI SHENDE 55500 PUNE JAVA 3
3002 ANUJA WANRE 50500 JAIPUR FMW 2
3003 DEEPAM JAUHARI 58500 Bombay JAVA 3
4001 RAJESH GOUD 60500 Bombay TEST 4
4002 ASHWINI BAGHAT 54500 NOÏDA JAVA 3
4003 RUCHIKA AGARWAL 60000 DELHI ORACLE 1
5001 ARCHIT SHARMA 55500 DELHI TEST 4

N salaire le plus élevé à l'aide d'une sous-requête corrélée

Une sous-requête corrélée est un type spécial de sous-requête, où la sous-requête dépend de la requête principale et est exécutée pour chaque ligne renvoyée par la requête principale.

Syntaxe :

SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Où N peut être remplacé par les nombres 23 ou 4.

Exemple 1 : Rédigez une requête pour trouver les 4 salaires les plus élevés :

SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Où N =4, N -1 :4 -1 =3.

4 salaire le plus élevé du tableau

Sortie :

Employeeid Salaire
3003 58500

Explication :

Le mot-clé distinct est là pour gérer les salaires dupliqués dans le tableau. Pour rechercher le N salaire le plus élevé, nous ne considérons que les salaires non doublons. Le salaire le plus élevé signifie qu'aucun salaire n'est supérieur à celui-ci. Le deuxième salaire le plus élevé signifie qu'un seul salaire est supérieur à celui-ci. Le troisième salaire le plus élevé signifie que seuls deux salaires sont supérieurs au troisième salaire, de même le Nième salaire le plus élevé signifie que les salaires N-1 sont supérieurs à celui-ci.

Le quatrième salaire le plus élevé est 58500 de l'ID d'employé 3003.

Exemple 2 :Rédigez une requête pour trouver les 3 salaires les plus élevés :

SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Où N =3, N -1 :3 -1 =2.

2 salaire le plus élevé du tableau

Sortie :

Employeeid Salaire
1002 60000
4003 60000

Le deuxième salaire le plus élevé est 58 500 sur deux ID d'employé 1002 et ID d'employé 4003.

Exemple 3 :Rédigez une requête pour trouver les 5 salaires les plus élevés :

SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Où N =6, N -1 :6 -1 =5.

5 salaires les plus élevés du tableau

Sortie :

Employeeid Salaire
4002 54500

Le cinquième salaire le plus élevé est 54500 de l'ID d'employé 4002.

N Salaire le plus élevé avec LIMIT mot-clé

Syntaxe :

SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;

Exemple 1 : Rédigez une requête pour trouver les 2 salaires les plus élevés.

SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;

Sortie :

Employeeid Salaire
2002 65500

Limite 1, 1 dans la requête indique le montant du salaire le plus élevé à afficher.

Si vous écrivez 1, 2 sorties seront comme ça

Employeeid Salaire
2002 65500
4001 60500

N Salaire le plus élevé avec le mot-clé TOP

Le scénario consiste à calculer le salaire de l'employé N le plus élevé à partir de la table des employés. Les étapes sont les suivantes :

1. La première étape consiste à rechercher le salaire unique TOP des employés dans le tableau.
2. L'étape suivante consiste à calculer le salaire minimum parmi tous les salaires issus de la première étape. Par cette étape, nous obtenons N salaire le plus élevé.
3. À partir du résultat des étapes ci-dessus, identifiez les détails de l'employé dont le salaire est le salaire minimum.

Exemple 1 :

SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

L'instruction SQL ci-dessus est utilisée pour trouver les détails des employés avec le salaire le plus élevé.

Voyons brièvement l'explication de l'instruction SQL ci-dessus :

Considérez N =4.

Chaque fois qu'une requête SQL inclut une sous-requête, rappelez-vous que la requête interne s'exécutera en premier, puis la requête externe sera exécutée.

Le résultat suivant sera généré par la requête "SELECT DISTINCT TOP N salaire des employés ORDER BY salaire DESC", qui générera le résultat suivant.

Salaire
65 500
60500
60 000
58 500

La requête externe suivante est :"SELECT MIN(salaire) FROM employés WHERE salaire IN (la sortie d'une requête SQL précédente.

Salaire
58 500

À partir du résultat ci-dessus, il est vérifié que le quatrième salaire le plus élevé requis est de 58 500.

Enfin, la requête principale est SELECT * FROM employés WHERE salaire =résultat de la requête SQL précédente. Le résultat de cette requête sera le résultat des employés ayant le quatrième salaire le plus élevé.

FIRST_NAME SALAIRE
DEEPAM 58500

Exemple 2 :

SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

L'instruction SQL ci-dessus est utilisée pour trouver les détails des employés avec le salaire N le plus élevé.

Voyons brièvement l'explication de l'instruction SQL ci-dessus :

Considérez N =5.

Chaque fois qu'une requête SQL inclut une sous-requête, rappelez-vous que la requête interne s'exécutera en premier, puis la requête externe sera exécutée.

Le résultat suivant sera généré par la requête "SELECT DISTINCT TOP N salaire des employés ORDER BY salaire DESC", qui générera le résultat suivant.

Salaire
65 500
60500
60 000
58 500
55 500

La requête externe suivante est :"SELECT MIN(salaire) FROM employés WHERE salaire IN (la sortie d'une requête SQL précédente.

Salaire
55 500

À partir du résultat ci-dessus, il est vérifié que le cinquième salaire le plus élevé requis est de 55 500.

Enfin, la requête principale est SELECT * FROM employés WHERE salaire =résultat de la requête SQL précédente. Le résultat de cette requête sera le résultat des employés ayant le cinquième salaire le plus élevé.

FIRST_NAME SALAIRE
PRACHI 55500

Nième salaire le plus élevé avec la fonction Row_Num()

Exemple :

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
  • Pour calculer le troisième salaire le plus élevé, utilisez rownum < 4
  • Pour calculer le deuxième salaire le plus élevé, utilisez rownum < 3

Sortie :

MIN(salaire
60500

Voyons comment fonctionne la requête :

Étape 1 : La requête comprend une sous-requête signifie une requête interne et une requête externe. Nous savons tous que lorsque la sous-requête est utilisée dans la requête, la requête interne est d'abord exécutée

Tout d'abord, la requête interne sera exécutée, puis les requêtes externes seront exécutées en fonction de la sortie produite par la requête interne :

Requête interne :

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

Sortie de la requête interne :

Salaire
65 500
60500
60 000
58 500
55 500
54 500
50 500
50 000

Comme nous avons utilisé un mot-clé distinct dans la requête, le salaire en double sera éliminé. Le salaire unique sera affiché à la suite de la requête interne.

Étape 2 : Comme le serveur est fait avec une requête interne, nous exécutons la requête externe de la requête imbriquée dans la sortie que nous avons obtenue à partir de la requête interne

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

SELECT MIN(salary) FROM (sortie de la requête interne) :sélectionnez le salaire minimum dans la sortie de la requête interne, qui est 50000 et 50000 n'est pas le deuxième salaire le plus élevé, à cause duquel nous avons utilisé rownum <3, ce qui donnera le nombre de lignes à partir du haut qui est inférieure à 3 signifie seulement 2.

La sortie de WHERE rownum <3 :

Salaire
65 500
60500

Étape 3 : La dernière partie de la requête, qui est le SELECT MIN(salaire) de (la sortie de WHERE rownum<3):

Le résultat final de la requête :

Salaire
60500

60500 est le deuxième salaire le plus élevé sur la table des employés.

Nième salaire le plus élevé en utilisant la fonction Rank Rank ()

Exemple :

SELECT * FROM(SELECT First_Name, salary, dense_rank()      OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =&num;

- Pour calculer le troisième salaire le plus élevé, utilisez num =3

- Pour calculer le deuxième salaire le plus élevé, utilisez num =2

Nous irons pour num =2.

Le résultat final :

Prénom Salaire Classement
Rajesh 60500 2

O sortie de la requête interne :

SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees

La fonction Dense_rank() calcule le rang de chaque ligne dans un groupe d'ordre de lignes dans l'ordre croissant et renvoie le rang sous forme de nombre. Le rang commence à partir de 1 et ainsi de suite.

Dans le cas où deux ou plus de deux lignes ont le même salaire, il attribue un rang égal à toutes les lignes.

Sortie de la requête interne :

Prénom Salaire Classement
VAIBHAVI 65500 1
BHAVESH 65500 1
RAJESH 60500 2
VAIBHAV 60000 3
RUCHIKA 60000 3
DEEPAM 58500 4
PRACHI 55500 5
PRANOTI 55500 5
ARCHITEC 55500 5
ASHWINI 54500 6
NIKHIL 50500 7
ANUJA 50500 7
RUCHIKA 50000 8

Dans la sortie, nous pouvons voir le même classement pour doubler le salaire.

Étape 2 : Comme le serveur est fait avec une requête interne, nous exécutons la requête externe de la requête imbriquée dans la sortie que nous avons obtenue à partir de la requête interne

SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = &num;

Select * from sélectionnera toutes les lignes qui ne sont pas le deuxième salaire le plus élevé car nous avons utilisé RankRank où num =2 donnera des lignes correspondantes en fonction de la valeur saisie par l'utilisateur pour num.

Comme nous avons utilisé num =2, la sortie sera

Prénom Salaire Classement
RAJESH 60500 2
  • Pour trouver le troisième ensemble de salaires num =3,
  • Pour trouver le quatrième ensemble de salaires num =4, et ainsi de suite.