Database
 sql >> Baza danych >  >> RDS >> Database

N-ta najwyższa pensja

Najczęstsze i najważniejsze pytanie zadawane w wywiadach dotyczy tego, jak znaleźć N-tą najwyższą pensję w tabeli (2 najwyższa pensja, 3 najwyższa pensja lub N-ta najwyższa pensja), gdzie N może być 2, 3, 4, 5 lub cokolwiek.

Każdy programista wie, że najłatwiejszym sposobem na znalezienie n najwyższej pensji jest użycie SQL (Structured Query Language) w tabeli.

Za każdym razem, gdy ankieter zadaje Ci pytanie o 2 najwyższe wynagrodzenie, 4 najwyższe wynagrodzenie itd., aby rozwiązać to pytanie, powinniśmy wiedzieć o kilku ważnych pojęciach, takich jak podzapytanie, funkcja do użycia, jak row_num(), Rank Rank () itp.

W tym artykule dowiesz się, jak znaleźć najwyższą pensję N.

Rozważ istniejące tabele, które mają następujące rekordy:

Tabela:Pracownicy

ID PRACOWNIKA FIRST_NAME LAST_NAME WYNAGRODZENIE MIASTO DZIAŁ IDENTYFIKATOR KIEROWCY
1001 VAIBHAVI MISHRA 65500 PUNE WYROCZNIA 1
1002 VAIBHAV SHARMA 60000 NOIDA C# 5
1003 NIKHIL VANI 50500 JAIPUR FMW 2
2001 PRACI SHARMA 55500 CZANDIGAR WYROCZNIA 1
2002 PRZYJMUJ SIĘ JAIN 65500 PUNE FMW 2
2003 RUCHIKA JAIN 50000 MUMBAJ C# 5
3001 PRANOTI SHENDE 55500 PUNE JAVA 3
3002 ANUJA WANRE 50500 JAIPUR FMW 2
3003 DEEPAM JAUHARI 58500 MUMBAJ JAVA 3
4001 RAJESH GOUD 60500 MUMBAJ TESTOWANIE 4
4002 ASHWINI TORBA 54500 NOIDA JAVA 3
4003 RUCHIKA AGARWAL 60000 DELHI WYROCZNIA 1
5001 ARCHIT SHARMA 55500 DELHI TESTOWANIE 4

N najwyższe wynagrodzenie przy użyciu skorelowanego podzapytania

Skorelowane podzapytanie to specjalny typ podzapytania, w którym podzapytanie zależy od głównego zapytania i jest wykonywane dla każdego wiersza zwróconego przez główne zapytanie.

Składnia:

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

Gdzie N można zastąpić liczbami 23 lub 4.

Przykład 1: Napisz zapytanie, aby znaleźć 4 najwyższe wynagrodzenie:

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

Gdzie N =4, N -1:4 -1 =3.

4 najwyższe wynagrodzenie ze stołu

Wyjście:

Identyfikator pracownika Wynagrodzenie
3003 58500

Wyjaśnienie:

Słowo kluczowe different służy do obsługi zduplikowanych wynagrodzeń w tabeli. Aby wyszukać najwyższą pensję N, bierzemy pod uwagę tylko pensje niebędące duplikatami. Najwyższa pensja oznacza, że ​​żadna pensja nie jest od niej wyższa. Druga najwyższa pensja oznacza, że ​​tylko jedna pensja jest od niej wyższa. Trzecia najwyższa pensja oznacza, że ​​tylko dwie pensje są wyższe od trzeciej pensji, podobnie N-ta najwyższa pensja oznacza, że ​​pensje N-1 są od niej wyższe.

Czwarta najwyższa pensja to 58500 identyfikatora pracownika 3003.

Przykład 2:Napisz zapytanie, aby znaleźć 3 najwyższe wynagrodzenie:

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

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

2 najwyższe wynagrodzenie ze stołu

Wyjście:

Identyfikator pracownika Wynagrodzenie
1002 60000
4003 60000

Druga najwyższa pensja to 58500 z dwóch identyfikatorów pracowników 1002 i identyfikatorów pracowników 4003.

Przykład 3:Napisz zapytanie, aby znaleźć 5 najwyższych zarobków:

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

Gdzie N =6, N -1:6 -1 =5.

5 najwyższa pensja ze stołu

Wyjście:

Identyfikator pracownika Wynagrodzenie
4002 54500

Piąta najwyższa pensja to 54500 identyfikatora pracownika 4002.

N Najwyższa pensja przy użyciu LIMIT słowa kluczowego

Składnia:

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

Przykład 1: Napisz zapytanie, aby znaleźć 2 najwyższe wynagrodzenie.

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

Wyjście:

Identyfikator pracownika Wynagrodzenie
2002 65500

Limit 1, 1 w zapytaniu określa, jaka ma być najwyższa pensja.

Jeśli napiszesz 1, 2 wyjścia będą takie

Identyfikator pracownika Wynagrodzenie
2002 65500
4001 60500

N Najwyższa pensja przy użyciu TOP słowa kluczowego

Scenariusz polega na obliczeniu N najwyższego wynagrodzenia pracownika z tabeli pracowników. Kroki są następujące:

1. Pierwszym krokiem jest wyszukanie w tabeli TOP wynagrodzenia pracowników.
2. Następnym krokiem jest obliczenie minimalnego wynagrodzenia spośród wszystkich wynagrodzeń wynikających z pierwszego kroku. Na tym etapie otrzymujemy N najwyższą pensję.
3. Na podstawie wyników powyższych kroków zidentyfikuj dane pracownika, którego wynagrodzenie jest wynagrodzeniem minimalnym.

Przykład 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 ));

Powyższe wyrażenie SQL służy do znajdowania danych pracowników z najwyższą pensją.

Zobaczmy w skrócie wyjaśnienie powyższej instrukcji SQL:

Rozważ N =4.

Za każdym razem, gdy jakiekolwiek zapytanie SQL zawiera podzapytanie, pamiętaj, że najpierw zostanie wykonane zapytanie wewnętrzne, a następnie zapytanie zewnętrzne.

Następujący wynik zostanie wygenerowany przez zapytanie „WYBIERZ WYRÓŻNIENIE NAJLEPSZE wynagrodzenie N od pracowników ORDER WEDŁUG wynagrodzenia DESC”, które wygeneruje następujący wynik.

Wynagrodzenie
65500
60500
60000
58500

Następne zapytanie zewnętrzne to:„SELECT MIN(wynagrodzenie) FROM pracowników WHERE wynagrodzenie IN (wyjście poprzedniego zapytania SQL.

Wynagrodzenie
58500

Z powyższego wyniku weryfikuje się, że wymagana czwarta najwyższa pensja to 58500.

Na koniec główne zapytanie to SELECT * FROM pracowników WHERE wynagrodzenie =wynik poprzedniego zapytania SQL. Wynikiem tego zapytania będzie wynik pracowników z czwartą najwyższą pensją.

FIRST_NAME WYNAGRODZENIE
DEEPAM 58500

Przykład 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 ));

Powyższe polecenie SQL służy do wyszukiwania danych pracowników z najwyższą pensją N.

Zobaczmy w skrócie wyjaśnienie powyższej instrukcji SQL:

Rozważ N =5.

Za każdym razem, gdy jakiekolwiek zapytanie SQL zawiera podzapytanie, pamiętaj, że najpierw zostanie wykonane zapytanie wewnętrzne, a następnie zapytanie zewnętrzne.

Następujący wynik zostanie wygenerowany przez zapytanie „WYBIERZ WYRÓŻNIENIE NAJLEPSZE wynagrodzenie N od pracowników ORDER WEDŁUG wynagrodzenia DESC”, które wygeneruje następujący wynik.

Wynagrodzenie
65500
60500
60000
58500
55500

Następne zapytanie zewnętrzne to:„SELECT MIN(wynagrodzenie) FROM pracowników WHERE wynagrodzenie IN (wyjście poprzedniego zapytania SQL.

Wynagrodzenie
55500

Z powyższego wyniku weryfikuje się, że wymagana piąta najwyższa pensja to 55500.

Na koniec główne zapytanie to SELECT * FROM pracowników WHERE wynagrodzenie =wynik poprzedniego zapytania SQL. Wynikiem tego zapytania będzie wynik pracowników z piątą najwyższą pensją.

FIRST_NAME WYNAGRODZENIE
PRACI 55500

N-ta najwyższa pensja przy użyciu funkcji Row_Num()

Przykład:

SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
  • Aby obliczyć trzecią najwyższą pensję, użyj rownum <4
  • Aby obliczyć drugą najwyższą pensję, użyj rownum <3

Wyjście:

MIN(wynagrodzenie
60500

Zobaczmy, jak działa zapytanie:

Krok 1: Zapytanie zawiera podzapytanie oznacza zapytanie wewnętrzne i zapytanie zewnętrzne. Wszyscy wiemy, kiedy podzapytanie jest używane w zapytaniu, wewnętrzne zapytanie jest najpierw wykonywane

Najpierw zostanie wykonane zapytanie wewnętrzne, a następnie zapytania zewnętrzne zostaną wykonane na podstawie danych wyjściowych wygenerowanych przez zapytanie wewnętrzne:

Zapytanie wewnętrzne:

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

Wyjście wewnętrznego zapytania:

Wynagrodzenie
65500
60500
60000
58500
55500
54500
50500
50000

Ponieważ w zapytaniu użyliśmy odrębnego słowa kluczowego, zduplikowane wynagrodzenie zostanie wyeliminowane. Unikalna pensja zostanie wyświetlona jako wynik wewnętrznego zapytania.

Krok 2: Ponieważ serwer wykonuje zapytanie wewnętrzne, wykonujemy zewnętrzne zapytanie zagnieżdżonego zapytania na dane wyjściowe, które uzyskaliśmy z zapytania wewnętrznego

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

SELECT MIN(salary) FROM (wewnętrzne wyjście zapytania):wybierz minimalną pensję z wewnętrznego wyjścia zapytania, która wynosi 50000, a 50000 nie jest drugą najwyższą pensją, z powodu której użyliśmy rownum <3, co da liczbę rzędy od góry, które są mniejsze niż 3, oznaczają tylko 2.

Wyjście WHERE rownum <3:

Wynagrodzenie
65500
60500

Krok 3: Ostatnia część zapytania, czyli SELECT MIN(wynagrodzenie) z (wyjście WHERE rownum<3):

Ostateczny wynik zapytania:

Wynagrodzenie
60500

60500 to drugie najwyższe wynagrodzenie na stole pracowników.

N-te najwyższe wynagrodzenie przy użyciu funkcji Ranga ()

Przykład:

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

- Aby obliczyć trzecią najwyższą pensję, użyj liczby =3

- Aby obliczyć drugą najwyższą pensję, użyj liczby =2

Pójdziemy dla num =2.

Ostateczny wynik:

Imię Wynagrodzenie Ranga
Rajesh 60500 2

O wyjście wewnętrznego zapytania:

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

Funkcja Dense_rank() oblicza Rangę każdego wiersza w grupie wierszy w kolejności rosnącej i zwraca Rangę jako liczbę. Ranga zaczyna się od 1 i tak dalej.

W przypadku, gdy dwa lub więcej niż dwa wiersze mają taką samą pensję, przypisuje równą rangę wszystkim wierszom.

Wyjście wewnętrznego zapytania:

Imię Wynagrodzenie Ranga
VAIBHAVI 65500 1
BHAVESH 65500 1
RAJESZ 60500 2
VAIBHAV 60000 3
RUCHIKA 60000 3
DEEPAM 58500 4
PRACI 55500 5
PRANOTI 55500 5
ARCHIT 55500 5
ASHWINI 54500 6
NIKHIL 50500 7
ANUJA 50500 7
RUCHIKA 50000 8

W danych wyjściowych widzimy ten sam ranking, aby zduplikować pensję.

Krok 2: Ponieważ serwer wykonuje zapytanie wewnętrzne, wykonujemy zewnętrzne zapytanie zagnieżdżonego zapytania na dane wyjściowe, które uzyskaliśmy z zapytania wewnętrznego

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

Wybierz * z zaznaczy wszystkie wiersze, które nie są drugą najwyższą pensją, ponieważ użyliśmy RankRank, gdzie num =2 da pasujące wiersze zgodnie z wartością wprowadzoną przez użytkownika dla num.

Ponieważ użyliśmy num =2, wynik będzie

Imię Wynagrodzenie Ranga
RAJESZ 60500 2
  • Aby znaleźć trzeci zestaw wynagrodzeń num =3,
  • Aby znaleźć czwarty zestaw wynagrodzeń num =4 i tak dalej.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Poziom izolacji SNAPSHOT

  2. Filtrowane indeksy i dołączone kolumny

  3. Różnica między oświadczeniem JDBC a przygotowanym oświadczeniem

  4. Błędy, pułapki i najlepsze praktyki T-SQL – podzapytania

  5. Konkatenacja w Transact-SQL