Database
 sql >> база данни >  >> RDS >> Database

N-та най-висока заплата

Най-честият и важен въпрос, задаван в интервюта, че как можем да намерим 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;

- За да изчислите третата най-висока заплата, използвайте 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 = &num;

Изберете * от ще избере всички редове, които не са втората най-висока заплата, тъй като сме използвали RankRank, където num =2 ще даде съвпадащи редове според стойността, въведена от потребителя за num.

Тъй като използвахме num =2, изходът ще бъде

First_name Заплата Ранг
РАДЖЕШ 60500 2
  • За да намерите третия набор за заплата num =3,
  • За да намерите четвъртия набор за заплата num =4 и така нататък.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Първи стъпки с Cloud Firestore за iOS

  2. Колко бърз е ODBC? „Заредено“ сравнение.

  3. Задаване и идентифициране на цели на редове в планове за изпълнение

  4. Подходи за сигурност в моделирането на данни. част 3

  5. Свържете ODBC приложения на Windows към QuickBooks Online