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