sql >> Databáze >  >> RDS >> Database

N-tý nejvyšší plat

Nejčastější a nejdůležitější otázka při pohovorech, jak najdeme N-tý nejvyšší plat v tabulce (2 nejvyšší plat, 3 nejvyšší plat nebo N-tý nejvyšší plat), kde N může být 2, 3, 4, 5 nebo cokoliv jiného.

Každý programátor ví, že nejjednodušší způsob, jak najít n nejvyšší plat, je pomocí SQL (Structured Query Language) v tabulce.

Kdykoli se vás tazatel zeptá na 2 nejvyšší plat, 4 nejvyšší plat atd., abychom tuto otázku vyřešili, měli bychom vědět o některých důležitých pojmech, jako je poddotaz, funkce, která se má použít jako row_num(), Rank Rank () , atd.

Tento článek vám ukáže různé způsoby, jak najít nejvyšší plat N.

Zvažte existující tabulky, které mají následující záznamy:

Tabulka:Zaměstnanci

ID ZAMĚSTNANCE FIRST_NAME LAST_NAME PLAT MĚSTO ODDĚLENÍ ID SPRÁVCE
1001 VAIBHAVI MISHRA 65500 PUNE ORACLE 1
1002 VAIBHAV SHARMA 60 000 NOIDA C# 5
1003 NIKHIL VANI 50500 JAIPUR FMW 2
2001 PRACHI SHARMA 55500 CHANDIgarH ORACLE 1
2002 BHAVESH JAIN 65500 PUNE FMW 2
2003 RUCHIKA JAIN 50 000 MUMBAI C# 5
3001 PRANOTI SHENDE 55500 PUNE JAVA 3
3002 ANUJA WANRE 50500 JAIPUR FMW 2
3003 DEEPAM JAUHARI 58500 MUMBAI JAVA 3
4001 RAJESH GOUD 60500 MUMBAI TESTOVÁNÍ 4
4002 ASHWINI BAGHAT 54500 NOIDA JAVA 3
4003 RUCHIKA AGARWAL 60 000 DELHI ORACLE 1
5001 ARCHIT SHARMA 55500 DELHI TESTOVÁNÍ 4

N nejvyšší plat pomocí korelovaného dílčího dotazu

Korelovaný poddotaz je speciální typ poddotazu, kde poddotaz závisí na hlavním dotazu a je proveden pro každý řádek vrácený hlavním dotazem.

Syntaxe:

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

Kde N lze nahradit čísly 23 nebo 4.

Příklad 1: Napište dotaz a najděte 4 nejvyšší plat:

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

Kde N =4, N-1:4-1 =3

4 nejvyšší plat od tabulky

Výstup:

ID zaměstnance Plat
3003 58500

Vysvětlení:

Odlišné klíčové slovo je zde pro zpracování duplicitních platů v tabulce. Při hledání nejvyššího platu N uvažujeme pouze neduplikované platy. Nejvyšší plat znamená, že žádný plat není vyšší než on. Druhý nejvyšší plat znamená, že pouze jeden plat je vyšší. Třetí nejvyšší plat znamená, že pouze dva platy jsou vyšší než třetí plat, podobně N-tý nejvyšší plat znamená, že platy N-1 jsou vyšší než on.

Čtvrtý nejvyšší plat je 58 500 z id zaměstnance 3003.

Příklad 2:Napište dotaz a najděte 3 nejvyšší plat:

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

Kde N =3, N-1:3-1 =2.

2 nejvyšší plat od tabulky

Výstup:

ID zaměstnance Plat
1002 60 000
4003 60 000

Druhý nejvyšší plat je 58 500 ze dvou zaměstnanců id 1002 a zaměstnanec id 4003.

Příklad 3:Napište dotaz a najděte 5 nejvyšších platů:

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

Kde N =6, N-1:6-1 =5

5 nejvyšší plat od tabulky

Výstup:

ID zaměstnance Plat
4002 54500

Pátý nejvyšší plat je 54 500 ze zaměstnaneckého id 4002.

N Nejvyšší plat při použití klíčového slova LIMIT

Syntaxe:

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

Příklad 1: Napište dotaz a najděte 2 nejvyšší platy.

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

Výstup:

ID zaměstnance Plat
2002 65500

Limit 1, 1 v dotazu říká, kolik má být zobrazen nejvyšší plat.

Pokud napíšete 1, 2 výstupy budou takto

ID zaměstnance Plat
2002 65500
4001 60500

N Nejvyšší plat pomocí klíčového slova TOP

Scénář je vypočítat N nejvyšší mzdu zaměstnance z tabulky zaměstnanců. Postup je následující:

1. Prvním krokem je vyhledání TOP unikátního platu zaměstnanců z tabulky.
2. Dalším krokem je výpočet minimální mzdy ze všech platů vyplývajících z prvního kroku. Tímto krokem získáme N nejvyšší plat.
3. Z výsledku výše uvedených kroků určete podrobnosti o zaměstnanci, jehož mzda je minimální mzda.

Příklad 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 ));

Výše uvedený příkaz SQL se používá k nalezení podrobností o zaměstnancích s nejvyšší mzdou.

Podívejme se stručně na vysvětlení výše uvedeného příkazu SQL:

Uvažujme N =4.

Kdykoli jakýkoli dotaz SQL obsahuje dílčí dotaz, pamatujte, že nejprve se provede vnitřní dotaz a poté se provede vnější dotaz.

Následující výsledek bude vygenerován dotazem "SELECT DISTINCT TOP N plat od zaměstnanců ORDER BY pay DESC", který vygeneruje následující výsledek.

Plat
65500
60500
60 000
58500

Další vnější dotaz je:"VYBERTE MIN (plat) OD zaměstnanců WHERE plat IN (výstup předchozího SQL dotazu.

Plat
58500

Z výše uvedeného výsledku je ověřeno, že požadovaný čtvrtý nejvyšší plat je 58 500.

A konečně, hlavní dotaz je SELECT * FROM zaměstnanců WHERE plat =výstup předchozího SQL dotazu. Výstupem tohoto dotazu bude výsledek, kdy zaměstnanci mají čtvrtý nejvyšší plat.

FIRST_NAME PLAT
DEEPAM 58500

Příklad 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 ));

Výše uvedený příkaz SQL se používá k nalezení podrobností o zaměstnancích s nejvyšším platem N.

Podívejme se stručně na vysvětlení výše uvedeného příkazu SQL:

Uvažujme N =5.

Kdykoli jakýkoli dotaz SQL obsahuje dílčí dotaz, pamatujte, že nejprve se provede vnitřní dotaz a poté se provede vnější dotaz.

Následující výsledek bude vygenerován dotazem "SELECT DISTINCT TOP N plat od zaměstnanců ORDER BY pay DESC", který vygeneruje následující výsledek.

Plat
65500
60500
60 000
58500
55500

Další vnější dotaz je:"VYBERTE MIN (plat) OD zaměstnanců WHERE plat IN (výstup předchozího SQL dotazu.

Plat
55500

Z výše uvedeného výsledku je ověřeno, že požadovaný pátý nejvyšší plat je 55 500.

A konečně, hlavní dotaz je SELECT * FROM zaměstnanců WHERE plat =výstup předchozího SQL dotazu. Výstupem tohoto dotazu bude výsledek zaměstnanců s pátou nejvyšší mzdou.

FIRST_NAME PLAT
PRACHI 55500

N. nejvyšší plat pomocí funkce Row_Num()

Příklad:

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
  • Pro výpočet třetího nejvyššího platu použijte rownum <4
  • Pro výpočet druhého nejvyššího platu použijte rownum <3

Výstup:

MIN(plat
60500

Pojďme se podívat, jak dotaz funguje:

Krok 1: Dotaz obsahuje poddotaz znamená vnitřní dotaz a vnější dotaz. Všichni víme, že když je v dotazu použit poddotaz, nejprve se provede vnitřní dotaz

Nejprve bude proveden vnitřní dotaz a poté budou provedeny vnější dotazy na základě výstupu vytvořeného vnitřním dotazem:

Vnitřní dotaz:

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

Výstup vnitřního dotazu:

Plat
65500
60500
60 000
58500
55500
54500
50500
50 000

Protože jsme v dotazu použili odlišné klíčové slovo, duplicitní plat bude odstraněn. Jedinečný plat se zobrazí jako výsledek vnitřního dotazu.

Krok 2: Protože server provádí vnitřní dotaz, provádíme vnější dotaz vnořeného dotazu do výstupu, který jsme získali z vnitřního dotazu

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

SELECT MIN(plat) FROM (vnitřní výstup dotazu):z výstupu vnitřního dotazu vyberte minimální mzdu, která je 50000 a 50000 není druhá nejvyšší mzda, kvůli které jsme použili rownum <3, což dá počet řádků shora, což je méně než 3, znamená pouze 2.

Výstup WHERE rownum <3:

Plat
65500
60500

Krok 3: Poslední část dotazu, což je SELECT MIN(plat) z (výstup WHERE rownum<3):

Konečný výstup dotazu:

Plat
60500

60500 je druhý nejvyšší plat na stole zaměstnanců.

N. nejvyšší plat pomocí funkce Rank Rank ()

Příklad:

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

- Pro výpočet třetího nejvyššího platu použijte num =3

- Pro výpočet druhého nejvyššího platu použijte num =2

Půjdeme na číslo =2.

Konečný výstup:

Jméno Plat Hodnocení
Rajesh 60500 2

O Výstup vnitřního dotazu:

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

Funkce Dense_rank() vypočítá hodnocení každého řádku v pořadí skupiny řádků ve vzestupném pořadí a vrátí pořadí jako číslo. Pořadí začíná od 1 a tak dále.

V případě, že dva nebo více než dva řádky mají stejný plat, přiřadí stejnou hodnost všem řádkům.

Výstup vnitřního dotazu:

Jméno Plat Hodnocení
VAIBHAVI 65500 1
BHAVESH 65500 1
RAJESH 60500 2
VAIBHAV 60 000 3
RUCHIKA 60 000 3
DEEPAM 58500 4
PRACHI 55500 5
PRANOTI 55500 5
ARCHIT 55500 5
ASHWINI 54500 6
NIKHIL 50500 7
ANUJA 50500 7
RUCHIKA 50 000 8

Ve výstupu můžeme vidět stejné pořadí pro duplicitní plat.

Krok 2: Protože server provádí vnitřní dotaz, provádíme vnější dotaz vnořeného dotazu do výstupu, který jsme získali z vnitřního dotazu

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

Vybrat * z vybere všechny řádky, které nejsou druhým nejvyšším platem, protože jsme použili RankRank, kde num =2 poskytne odpovídající řádky podle hodnoty zadané uživatelem pro num.

Protože jsme použili num =2, výstup bude

Jméno Plat Hodnocení
RAJESH 60500 2
  • Chcete-li najít třetí plat nastavený num =3,
  • Chcete-li najít čtvrtý plat, nastavte číslo =4 a tak dále.


  1. Výkonnostní limity řešení logické replikace

  2. Pochopení aliasů Oracle – proč není alias v dotazu rozpoznán, pokud není zabalen do druhého dotazu?

  3. Mám použít !=nebo <> pro nerovné v T-SQL?

  4. změnit sloupec přetažení tabulky v databázi Oracle