Comment trouver le nième / deuxième salaire le plus élevé et le plus bas en SQL

D'après ce que j'ai entendu de la part d'amis et d'autres utilisateurs en ligne et de mon expérience personnelle, la question de l'entretien d'embauche la plus courante pour les programmeurs de bases de données est "Comment trouvez-vous le salaire le plus élevé dans une table d'employés?"

Cette question teste les connaissances d'un candidat en matière de fonctions de classement, de sous-requêtes, d'expression de table commune (CTE) et de base SQL.

Nous explorerons la réponse à l'aide d'une série de scénarios et de questions posées en vue de déterminer le salaire le plus élevé, le moins élevé et le nième le plus élevé.

Créons une table d'employés et remplissons-la avec des données de test.

SI OBJECT_ID (N'Employee ', N'U') N'EST PAS NULL DROP TABLE Employee; CREATE TABLE Employee (EmployeeId INT PRIMARY KEY, Salary Numeric (18,2)); Insérer dans les valeurs des employés (101,20000.00); Insérer dans les valeurs des employés (102,25000,00); Insérer dans les valeurs des employés (103,30000.00); Insérer dans les valeurs des employés (104,35000.00); Insérer dans les valeurs des employés (105,35000.00); Insérer dans les valeurs des employés (106,45000.00); SELECT * FROM Employee; 

Requête 1.1 Trouver l'employé avec le salaire le plus élevé

SELECT EmployeeId, Salary FROM (Sélectionnez EmployeeId, Salary, ROW_NUMBER () OVER (Trier par Salary Desc) comme Salary_Order from Employee) DT WHERE DT. Salary_Order = 1; 

La requête ci-dessus utilise le concept de table dérivée, où la sous-requête avec la fonction de classement ligne_numéro attribue un numéro séquentiel unique (1,2,3… à N) à un salaire classé par ordre décroissant (du plus élevé au plus faible). Ainsi, 1 sera affecté au salaire le plus élevé, 2 au deuxième salaire le plus élevé, etc., en utilisant la table dérivée pour extraire la ligne avec le numéro_ligne attribué à 1.

Requête 1.2 Trouver l'employé avec le salaire le plus élevé en cas d'égalité (Deux employés ont le salaire le plus élevé et le même nombre)

J'insère un autre employé dont le salaire correspond au salaire le plus élevé obtenu à l'aide de la requête 1.1 pour illustrer cet exemple.

Insérer dans les valeurs des employés (107,45000,00); SELECT EmployeeId, Salary FROM (Sélectionnez EmployeeId, Salary, DENSE_RANK () OVER (Commande par Salary Desc) comme Salary_Order from Employee) DT WHERE DT. Salary_Order = 1; 

Nous supprimons ici l'identifiant d'employé 107 que nous avions inséré pour la démonstration de la requête 1.2.

Supprimer de employee où EmployeeId = 107; 

Dans la requête ci-dessus, la fonction Dense_rank attribue le même numéro de rang consécutif en cas d'égalité. Par conséquent, il attribue le numéro 1 aux deux salaires les plus élevés (45 000) et les deux sont renvoyés à l'aide de la requête de table dérivée avec le filtre salaire_ordre = 1.

Requête 1.3 Trouver l'employé avec le deuxième salaire le plus élevé

SELECT EmployeeId, Salary FROM (Sélectionnez EmployeeId, Salary, ROW_NUMBER () OVER (Trier par Salary Desc) comme Salary_Order from Employee) DT WHERE DT. Salary_Order = 2; 

Nous utilisons ici la même logique que celle utilisée dans Query 1.1 avec la fonction ROW_NUMBER (), mais nous utilisons Salary_order = 2 pour récupérer le deuxième salaire le plus élevé.

Requête 1.4 Trouver l'employé avec le nième salaire le plus élevé

SELECT EmployeeId, Salary FROM (Sélectionnez EmployeeId, Salary, ROW_NUMBER () OVER (Trier par Salary Desc) comme Salary_Order from Employee) DT WHERE DT. Salary_Order = 4; 

Nous utilisons ici la même logique que celle utilisée dans Query 1.1 et Query 1.3. Nième signifie que vous pouvez spécifier n’importe quel nombre et que la requête récupérera le salaire au Nième nombre.

Requête 1.5 Trouver l'employé avec le salaire le plus bas

SELECT EmployeeId, Salary FROM (Sélectionnez EmployeeId, Salary, ROW_NUMBER () OVER (Order by Salary asc) en tant que Salary_Order from Employee) DT WHERE DT. Salary_Order = 1; 

Pour trouver le salaire le plus bas, nous utilisons Ordre par salaire par ordre croissant. Le résultat est donc trié par ordre croissant de salaire (du plus bas au plus élevé). Par conséquent, le salaire le plus bas recevra row_number = 1 et ainsi de suite. Nous utilisons le filtre Salary_Order = 1 pour récupérer le premier salaire le plus bas de la table des employés.

Requête 1.6 Recherche de l'employé avec le salaire le plus bas en cas d'égalité (Deux employés ont le même salaire et le même salaire)

J'insère un autre employé dont le salaire correspond au salaire le plus bas obtenu à l'aide de la requête ci-dessus pour illustrer cet exemple.

Insérer dans les valeurs des employés (109,20000.00); 
SELECT EmployeeId, Salary FROM (Sélectionnez EmployeeId, Salary, DENSE_RANK () OVER (Trier par salaire asc) comme Salary_Order from Employee) DT WHERE DT. Salary_Order = 1; 

Ici, nous supprimons l'employé avec 108 id qui a été inséré pour illustrer la requête ci-dessus.

supprimer de employee où employeeid = 109; 

Pour trouver le salaire le moins élevé avec des égalités, nous utilisons la fonction dense_rank, identique à Query 1.2. La fonction dense_rank attribuera des numéros consécutifs en cas de double salaire. Ainsi, pour le salaire le plus bas (20000,00), elle affectera le chiffre 1 aux deux salaires. En utilisant le filtre Salary_Order = 1, nous pouvons récupérer à la fois le salaire le plus bas en cas d’égalité avec la fonction dense_rank.

Requête 1.7 Recherche de l'employé avec le deuxième salaire le plus bas

SELECT EmployeeId, Salary FROM (Sélectionnez EmployeeId, Salary, ROW_NUMBER () OVER (Order by Salary asc) en tant que Salary_Order from Employee) DT WHERE DT. Salary_Order = 2; 

Ici, nous utilisons la même logique que celle utilisée dans la requête 1.3 avec la fonction ROW_NUMBER (), mais nous utilisons Salary_order = 2 pour récupérer le deuxième salaire le plus bas.