Най-честият и важен въпрос, задаван в интервюта, че как можем да намерим N-та най-висока заплата в таблица (2 най-високи заплати, 3 най-високи заплати или N-та най-висока заплата), където N може да бъде 2, 3, 4, 5 или нещо друго.
Всеки програмист знае, че най-лесният начин за намиране на n най-висока заплата е използването на SQL (Structured Query Language) в таблица.
Всеки път, когато интервюиращият ви зададе въпрос за 2-те най-високи заплати, 4-те най-високи заплати и т.н., за да разрешим този въпрос, трябва да знаем за някои важни понятия като подзаявка, функция, която да се използва като row_num(), Rank Rank () и др.
Тази статия ще ви информира за различни начини за намиране на N най-висока заплата.
Помислете за съществуващите таблици, които имат следните записи:
Таблица:Служители
ИДЕНТИФИКАТОР НА СЛУЖИТЕЛЯ | FIRST_NAME | LAST_NAME | ЗАПЛАТА | ГРАД | ОТДЕЛ | MANAGERID |
1001 | VAIBHAVI | МИШРА | 65500 | ПУНА | ORACLE | 1 |
1002 | VAIBHAV | ШАРМА | 60 000 | NOIDA | C# | 5 |
1003 | НИХИЛ | VANI | 50500 | ДЖАЙПУР | FMW | 2 |
2001 | PRACHI | ШАРМА | 55500 | ЧАНДИГАР | ORACLE | 1 |
2002 | BHAVESH | ДЖЕЙН | 65500 | ПУНА | FMW | 2 |
2003 | РУЧИКА | ДЖЕЙН | 50 000 | МУМБАЙ | C# | 5 |
3001 | PRANOTI | ШЕНДЕ | 55500 | ПУНА | JAVA | 3 |
3002 | ANUJA | WANRE | 50500 | ДЖАЙПУР | FMW | 2 |
3003 | DEEPAM | ДЖАУХАРИ | 58500 | МУМБАЙ | JAVA | 3 |
4001 | РАДЖЕШ | GOUD | 60500 | МУМБАЙ | ТЕСТВАНЕ | 4 |
4002 | ASHWINI | BAGHAT | 54500 | NOIDA | JAVA | 3 |
4003 | РУЧИКА | AGARWAL | 60 000 | ДЕЛХИ | ORACLE | 1 |
5001 | АРХИТ | ШАРМА | 55500 | ДЕЛХИ | ТЕСТВАНЕ | 4 |
N най-висока заплата с помощта на корелирана подзаявка
Свързаната подзаявка е специален тип подзаявка, при която подзаявката зависи от основната заявка и се изпълнява за всеки ред, върнат от основната заявка.
Синтаксис:
SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Където N може да бъде заменено с числа 23 или 4.
Пример 1: Напишете заявка, за да намерите 4-те най-високи заплати:
SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Където N =4, N -1:4 -1 =3.
4 най-висока заплата от таблицата
Изход:
Идентификатор на служители | Заплата |
3003 | 58500 |
Обяснение:
Отделната ключова дума е там, за да се справи с дублираните заплати в таблицата. За да търсим N най-високата заплата, ние разглеждаме само недублирани заплати. Най-високата заплата означава, че няма заплата по-висока от нея. Втората най-висока заплата означава, че само една заплата е по-голяма от нея. Третата най-висока заплата означава, че само две заплати са по-високи от третата заплата, подобно на N-та най-висока заплата означава, че N-1 заплати са по-високи от нея.
Четвъртата най-висока заплата е 58500 от идентификатор на служител 3003.
Пример 2:Напишете заявка, за да намерите 3-те най-високи заплати:
SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Където N =3, N -1:3 -1 =2.
2 най-висока заплата от таблицата
Изход:
Идентификатор на служители | Заплата |
1002 | 60 000 |
4003 | 60 000 |
Втората най-висока заплата е 58500 от двама служители 1002 и 4003.
Пример 3:Напишете заявка, за да намерите 5-те най-високи заплати:
SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)
Където N =6, N -1:6 -1 =5.
5 най-висока заплата от таблицата
Изход:
Идентификатор на служители | Заплата |
4002 | 54500 |
Петата най-висока заплата е 54500 на служител 4002.
N Най-висока заплата с LIMIT ключова дума
Синтаксис:
SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;
Пример 1: Напишете заявка, за да намерите 2 най-високи заплати.
SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;
Изход:
Идентификатор на служители | Заплата |
2002 | 65500 |
Лимит 1, 1 в заявката казва колко най-високата заплата трябва да се покаже.
Ако напишете 1, 2 изхода ще бъдат така
Идентификатор на служители | Заплата |
2002 | 65500 |
4001 | 60500 |
N Най-висока заплата с ТОП ключова дума
Сценарият е да се изчисли N най-високата заплата на служителите от таблицата на служителите. Стъпките са както следва:
1. Първата стъпка е да потърсите ТОП уникалната заплата на служителите от таблицата.
2. Следващата стъпка е да се изчисли минималната заплата сред всички заплати, получени от първата стъпка. С тази стъпка получаваме N най-висока заплата.
3. От резултата от горните стъпки идентифицирайте данните за служителя, чиято заплата е минималната заплата.
Пример 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 ));
Горният SQL оператор се използва за намиране на подробности за служителите с най-висока заплата.
Нека видим накратко обяснението на горния SQL израз:
Помислете за N =4.
Всеки път, когато някоя SQL заявка включва подзаявка, не забравяйте, че вътрешната заявка ще се изпълни първо, след което външната заявка ще бъде изпълнена.
Следният резултат ще бъде генериран от заявката „ИЗБЕРЕТЕ DISTINCT TOP N заплата от служители ORDER BY salary DESC“, която ще генерира следния резултат.
Заплата |
65500 |
60500 |
60000 |
58500 |
Следващата външна заявка е:„ИЗБЕРЕТЕ МИН.(заплата) ОТ служители, КЪДЕ заплата В (изходът от предишна SQL заявка.
Заплата |
58500 |
От горния резултат се потвърждава, че изискваната четвърта най-висока заплата е 58500.
И накрая, основната заявка е SELECT * FROM staff WHERE заплата =изход от предишна SQL заявка. Резултатът от тази заявка ще бъде резултат на служителите, които имат четвъртата най-висока заплата.
FIRST_NAME | ЗАПЛАТА |
DEEPAM | 58500 |
Пример 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 ));
Горният SQL оператор се използва за намиране на подробности за служителите с N най-висока заплата.
Нека видим накратко обяснението на горния SQL израз:
Помислете за N =5.
Всеки път, когато някоя SQL заявка включва подзаявка, не забравяйте, че вътрешната заявка ще се изпълни първо, след което външната заявка ще бъде изпълнена.
Следният резултат ще бъде генериран от заявката „ИЗБЕРЕТЕ DISTINCT TOP N заплата от служители ORDER BY salary DESC“, която ще генерира следния резултат.
Заплата |
65500 |
60500 |
60000 |
58500 |
55500 |
Следващата външна заявка е:„ИЗБЕРЕТЕ МИН.(заплата) ОТ служители, КЪДЕ заплата В (изходът от предишна SQL заявка.
Заплата |
55500 |
От горния резултат се потвърждава, че изискваната пета най-висока заплата е 55 500.
И накрая, основната заявка е SELECT * FROM staff WHERE заплата =изход от предишна SQL заявка. Резултатът от тази заявка ще бъде резултат на служителите, които имат пета най-висока заплата.
FIRST_NAME | ЗАПЛАТА |
PRACHI | 55500 |
N-та най-висока заплата с помощта на функцията Row_Num()
Пример:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
- За да изчислите третата най-висока заплата, използвайте rownum <4
- За да изчислите втората най-висока заплата, използвайте rownum <3
Изход:
MIN(заплата |
60500 |
Нека видим как работи заявката:
Стъпка 1: Заявката включва подзаявка означава вътрешна заявка и външна заявка. Всички знаем, когато подзаявката се използва в заявката, вътрешната заявка се изпълнява първо
Първо, вътрешната заявка ще бъде изпълнена, след което външните заявки ще бъдат изпълнени въз основа на изхода, произведен от вътрешната заявка:
Вътрешна заявка:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
Изход на вътрешната заявка:
Заплата |
65500 |
60500 |
60000 |
58500 |
55500 |
54500 |
50500 |
50 000 |
Тъй като използвахме отделна ключова дума в заявката, дублираната заплата ще бъде елиминирана. Уникалната заплата ще бъде показана като резултат от вътрешната заявка.
Стъпка 2: Тъй като сървърът е завършен с вътрешна заявка, ние изпълняваме външната заявка на вложената заявка в изхода, който получихме от вътрешната заявка
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER BY salary DESC) WHERE rownum < 3;
SELECT MIN(заплата) FROM (изход на вътрешна заявка):изберете минимална заплата от изхода на вътрешна заявка, която е 50000 и 50000 не е втората най-висока заплата, поради което сме използвали rownum <3, което ще даде броя на редове от върха, които са по-малко от 3 означава само 2.
Резултатът от WHERE rownum <3:
Заплата |
65500 |
60500 |
Стъпка 3: Последната част от заявката, която е SELECT MIN(заплата) от (изходът на WHERE rownum<3):
Крайният резултат от заявката:
Заплата |
60500 |
60500 е втората най-висока заплата на масата на служителите.
N-та най-висока заплата с помощта на функцията Rank Rank ()
Пример:
SELECT * FROM(SELECT First_Name, salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =#
- За да изчислите третата най-висока заплата, използвайте num =3
- За да изчислите втората най-висока заплата, използвайте num =2
Ще отидем на num =2.
Крайният изход:
Име | Заплата | Ранг |
Раджеш | 60500 | 2 |
О изход на вътрешната заявка:
SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees
Функцията Dense_rank() изчислява ранга на всеки ред в група редове във възходящ ред и връща ранга като число. Рангът започва от 1 и така нататък.
В случай, че два или повече от два реда имат една и съща заплата, тя присвоява еднакъв ранг на всички редове.
Изход на вътрешната заявка:
First_name | Заплата | Ранг |
VAIBHAVI | 65500 | 1 |
БХАВЕШ | 65500 | 1 |
РАДЖЕШ | 60500 | 2 |
VAIBHAV | 60 000 | 3 |
РУЧИКА | 60 000 | 3 |
DEEPAM | 58500 | 4 |
PRACHI | 55500 | 5 |
ПРАНОТИ | 55500 | 5 |
АРХИТ | 55500 | 5 |
ASHWINI | 54500 | 6 |
НИХИЛ | 50500 | 7 |
ANUJA | 50500 | 7 |
РУЧИКА | 50 000 | 8 |
В изхода можем да видим същото класиране на дублирана заплата.
Стъпка 2: Тъй като сървърът е завършен с вътрешна заявка, ние изпълняваме външната заявка на вложената заявка в изхода, който получихме от вътрешната заявка
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = #
Изберете * от ще избере всички редове, които не са втората най-висока заплата, тъй като сме използвали RankRank, където num =2 ще даде съвпадащи редове според стойността, въведена от потребителя за num.
Тъй като използвахме num =2, изходът ще бъде
First_name | Заплата | Ранг |
РАДЖЕШ | 60500 | 2 |
- За да намерите третия набор за заплата num =3,
- За да намерите четвъртия набор за заплата num =4 и така нататък.