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 =#
- 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 = #
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.