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