Come trovare l'ennesimo / secondo salario più alto e più basso in SQL

Sulla base di ciò che ho sentito da amici e altri utenti online e dalla mia esperienza personale, la domanda di intervista di lavoro più comune per i programmatori di database è "Come trovi lo stipendio più alto in un tavolo dei dipendenti?"

Questa domanda mette alla prova la conoscenza di un candidato sulle funzioni di classifica, sottoquery, espressione di tabella comune (CTE) e SQL di base.

Esploreremo la risposta con una serie di scenari e domande poste in relazione alla ricerca dello stipendio più alto, più basso e più alto.

Creiamo una tabella dei dipendenti e la popoliamo con alcuni dati di test.

IF OBJECT_ID (N'Employee ', N'U') NON È NULL DROP TABLE Employee; CREATE TABLE Employee (EmployeeId INT PRIMARY KEY, Salary Numeric (18,2)); Inserisci nei valori dei dipendenti (101.20000,00); Inserisci nei valori dei dipendenti (102,25000,00); Inserisci nei valori dei dipendenti (103.30000.00); Inserisci nei valori dei dipendenti (104,35000,00); Inserisci nei valori dei dipendenti (105,35000,00); Inserisci nei valori dei dipendenti (106,45000,00); SELEZIONA * Dipendente; 

Query 1.1 Trova il Dipendente con lo stipendio più alto

SELECT EmployeeId, Salary FROM (Selezionare EmployeeId, Salary, ROW_NUMBER () OVER (Ordina per Salary Desc) come Salary_Order dal Dipendente) DT WHERE DT. Salary_Order = 1; 

La query sopra utilizza il concetto di tabella derivata, in cui la sottoquery con numero_riga assegna un numero sequenziale univoco (da 1,2,3 ... a N) a uno stipendio ordinato in ordine decrescente (dal più alto al più basso). Quindi, 1 sarà assegnato allo stipendio più alto, 2 al secondo stipendio più alto e così via, usando la tabella derivata per recuperare la riga con numero_riga assegnata come 1.

Domanda 1.2 Trova il dipendente con lo stipendio più alto quando c'è un pareggio (Due impiegati hanno entrambi lo stipendio più alto e il numero è lo stesso)

Sto inserendo un altro dipendente il cui stipendio corrisponde allo stipendio più alto recuperato utilizzando Query 1.1 per dimostrare questo esempio.

Inserisci nei valori dei dipendenti (107,45000,00); SELECT EmployeeId, Salary FROM (Seleziona EmployeeId, Salary, DENSE_RANK () OVER (Ordina per Salary Desc) come Salary_Order dal Dipendente) DT WHERE DT. Salary_Order = 1; 

Qui stiamo eliminando l'ID dipendente 107 che avevamo inserito per la dimostrazione di Query 1.2.

Elimina dal dipendente dove EmployeeId = 107; 

Nella query sopra, la funzione Dense_rank assegna lo stesso numero di rango consecutivo quando c'è un pareggio. Pertanto assegna il numero 1 a entrambi gli stipendi più alti (45.000) ed entrambi vengono restituiti utilizzando la query della tabella derivata con il filtro salary_order = 1.

Query 1.3 Individuazione del dipendente con il secondo stipendio più alto

SELECT EmployeeId, Salary FROM (Selezionare EmployeeId, Salary, ROW_NUMBER () OVER (Ordina per Salary Desc) come Salary_Order dal Dipendente) DT WHERE DT. Salary_Order = 2; 

Qui stiamo usando la stessa logica usata in Query 1.1 con la funzione ROW_NUMBER (), ma stiamo usando Salary_order = 2 per recuperare il secondo stipendio più alto.

Query 1.4 Individuazione del dipendente con l'ennesimo stipendio

SELECT EmployeeId, Salary FROM (Selezionare EmployeeId, Salary, ROW_NUMBER () OVER (Ordina per Salary Desc) come Salary_Order dal Dipendente) DT WHERE DT. Salary_Order = 4; 

Qui stiamo usando la stessa logica usata in Query 1.1 e Query 1.3. N ° significa che è possibile specificare qualsiasi numero e la query recupererà lo stipendio al numero N °.

Query 1.5 Individuazione del dipendente con lo stipendio più basso

SELECT EmployeeId, Salary FROM (Selezionare EmployeeId, Salary, ROW_NUMBER () OVER (Ordina per Salary asc) come Salary_Order from Employee) DT WHERE DT. Salary_Order = 1; 

Per trovare lo stipendio più basso, stiamo usando Ordine per salario in ordine crescente, quindi il risultato è ordinato in ordine crescente per salario (dal più basso al più alto). Quindi, lo stipendio più basso otterrà row_number = 1 e così via. Utilizziamo il filtro Salary_Order = 1 per recuperare il primo salario più basso nella tabella dei dipendenti.

Domanda 1.6 Trovare il dipendente con lo stipendio più basso quando c'è un pareggio (due impiegati hanno entrambi lo stipendio più basso ed è lo stesso)

Sto inserendo un altro dipendente il cui stipendio corrisponde allo stipendio più basso recuperato utilizzando la query sopra per dimostrare questo esempio.

Inserisci nei valori dei dipendenti (109.20000,00); 
SELECT EmployeeId, Salary FROM (Selezionare EmployeeId, Stipendio, DENSE_RANK () OVER (Ordina per Salary asc) come Salary_Order from Employee) DT WHERE DT. Salary_Order = 1; 

Qui stiamo cancellando il dipendente con 108 id che è stato inserito per dimostrare la query sopra.

elimina dal dipendente dove employeeid = 109; 

Per trovare lo stipendio più basso con le legature, stiamo usando la funzione dense_rank che è la stessa di Query 1.2. La funzione dense_rank assegnerà numeri consecutivi in ​​cui vi è uno stipendio duplicato, quindi per il salario più basso (20000,00), assegnerà il numero 1 a entrambi i salari. Usando il filtro Salary_Order = 1, siamo in grado di recuperare sia lo stipendio più basso quando c'è legame usando la funzione dense_rank.

Query 1.7 Individuazione del dipendente con il secondo stipendio più basso

SELECT EmployeeId, Salary FROM (Selezionare EmployeeId, Salary, ROW_NUMBER () OVER (Ordina per Salary asc) come Salary_Order from Employee) DT WHERE DT. Salary_Order = 2; 

Qui stiamo usando la stessa logica usata in Query 1.3 con la funzione ROW_NUMBER (), ma stiamo usando Salary_order = 2 per recuperare il secondo stipendio più basso.