Så här hittar du Nth / Second Highest and Lowest Salary i SQL

Baserat på vad jag har hört från vänner och andra onlineanvändare och från min egen personliga erfarenhet är den vanligaste intervjunfrågan för databasprogrammerare "Hur hittar du den högsta lönen i ett anställd bord?"

Denna fråga testar en kandidats kunskaper om rankningsfunktioner, undersökningar, gemensamt tabelluttryck (CTE) och grundläggande SQL.

Vi kommer att utforska svaret med en serie scenarier och frågor som ställs för att hitta den högsta, lägsta och nth högsta lönen.

Låt oss skapa en anställd tabell och fylla den med vissa testdata.

OM OBJECT_ID (N'Employee ', N'U') ÄR INTE NULL DROP TABLE Employee; CREATE TABLE Medarbetare (EmployeeId INT PRIMARY KEY, Lön numerisk (18,2)); Infoga i anställda värden (101,20000.00); Infoga i anställda värden (102,25000,00); Infoga i anställda värden (103,30000.00); Infoga i anställda värden (104,35000,00); Infoga i anställda värden (105,35000,00); Infoga i anställda värden (106,45000,00); VÄLJ * FRÅN Medarbetare; 

Fråga 1.1 Hitta medarbetaren med den högsta lönen

VÄLJ Medarbetare, Lön FRÅN (Välj Anställd, Lön, RÅDNUMBER () ÖVER (Beställa Lön Desc) som Löneordnare från Medarbetare) DT VAR DT. Lön_Order = 1; 

Förfrågan ovan använder det härledda tabellkonceptet, där subqueryen med radnummers rankningsfunktion tilldelar ett unikt sekventiellt nummer (1,2,3 ... till N) till en lön som beställs i fallande ordning (högst till lägst). Således kommer 1 att tilldelas den högsta lönen, 2 till den näst högsta lönen osv. Med hjälp av den härledda tabellen för att hämta raden med radenummer som är tilldelad som 1.

Fråga 1.2 Hitta medarbetaren med den högsta lönen när det finns ett slips (två anställda har båda den högsta lönen och numret är detsamma)

Jag lägger in en anställd vars lön matchar den högsta lönen som hämtas med hjälp av Query 1.1 för att visa detta exempel.

Infoga i anställda värden (107,45000,00); VÄLJA Anställd, Lön FRÅN (Välj Anställd, Lön, DENSE_RANK () ÖVER (Beställa Lön Desc) som Lön_Order från Medarbetare) DT VAR DT. Lön_Order = 1; 

Här tar vi bort anställnings id 107 som vi hade lagt in för Query 1.2-demonstrationen.

Ta bort från anställd där EmployeeId = 107; 

I förfrågan ovan tilldelar Dense_rank-funktionen samma nummer i följd när det finns ett slips. Därför tilldelar den nummer 1 till båda högsta lönerna (45 000), och båda returneras med hjälp av den härledda tabellfrågan med lön_order = 1 filter.

Fråga 1.3 Hitta anställd med den andra högsta lönen

VÄLJ Medarbetare, Lön FRÅN (Välj Anställd, Lön, RÅDNUMBER () ÖVER (Beställa Lön Desc) som Löneordnare från Medarbetare) DT VAR DT. Lön_Order = 2; 

Här använder vi samma logik som används i Query 1.1 med funktionen ROW_NUMBER (), men vi använder Salary_order = 2 för att hämta andra Högsta lön.

Fråga 1.4 Hitta anställda med nth högsta lön

VÄLJ Medarbetare, Lön FRÅN (Välj Anställd, Lön, RÅDNUMBER () ÖVER (Beställa Lön Desc) som Löneordnare från Medarbetare) DT VAR DT. Lön_Order = 4; 

Här använder vi samma logik som används i Query 1.1 och Query 1.3. Nth betyder att du kan ange vilket nummer som helst, och frågan kommer att hämta lön vid Nth nummer.

Fråga 1.5 Hitta anställd med lägsta lön

VÄLJA Anställd, Lön FRÅN (Välj Medarbetare, Lön, RÅDNUMBER () ÖVER (Beställa av Lön ASC) som Löneordnare från Medarbetare) DT VAR DT. Lön_Order = 1; 

För att hitta den lägsta lönen använder vi Order efter lön i stigande ordning, så resultatet sorteras i stigande ordning för lön (lägst till högst). Den lägsta lönen får följaktligen row_number = 1 och så vidare. Vi använder filtret Salary_Order = 1 för att hämta den första lägsta lönen i anställd tabellen.

Fråga 1.6 Hitta arbetstagaren med lägsta lön när det finns ett slips (två anställda har båda lägst lön och det är detsamma)

Jag lägger in en anställd vars lön matchar den lägsta lön som hämtas med hjälp av frågan ovan för att visa detta exempel.

Infoga i anställda värden (109,20000.00); 
VÄLJ Medarbetare, Lön FRÅN (Välj Medarbetare, Lön, DENSE_RANK () ÖVRIGA (Beställa Lön ASC) som Löneordnare från Medarbetare) DT VAR DT. Lön_Order = 1; 

Här tar vi bort arbetstagaren med 108 id som infogades för att visa frågan ovan.

radera från anställd där employeeid = 109; 

För att hitta den lägsta lönen med slips använder vi funktionen dense_rank som är densamma som Query 1.2. Funktionen dense_rank kommer att tilldela efterföljande nummer där det finns en dubbel lön, så för den lägsta lönen (20000.00) kommer den att tilldela nummer 1 till båda lönen. Med hjälp av filteret Salary_Order = 1 kan vi hämta både den lägsta lön när det finns slips med funktionen dense_rank.

Fråga 1.7 Hitta anställd med andra lägsta lön

VÄLJA Anställd, Lön FRÅN (Välj Medarbetare, Lön, RÅDNUMBER () ÖVER (Beställa av Lön ASC) som Löneordnare från Medarbetare) DT VAR DT. Lön_Order = 2; 

Här använder vi samma logik som används i Query 1.3 med funktionen ROW_NUMBER (), men vi använder Salary_order = 2 för att hämta näst lägsta lön.