Jak znaleźć third or nth
maksymalne wynagrodzenie z pensji table(EmpID,EmpName,EmpSalary)
w zoptymalizowany sposób?
sql
sql-server
sql-server-2008
Karan Gandhi
źródło
źródło
Odpowiedzi:
Użyj
ROW_NUMBER
(jeśli chcesz jeden) lubDENSE_RANK
(dla wszystkich powiązanych wierszy):źródło
EmpSalary
kolumnie. Również zredukowane w porównaniu do czego? Zaletą tegoROW_NUMBER
podejścia jest to, że możesz użyć..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Możesz więc używać go do pobierania grup, ale nadal uzyskać dostęp do dowolnej kolumny.Numer wiersza :
Zapytanie podrzędne:
Najpopularniejsze słowo kluczowe:
źródło
... WHERE (N-1) = (Subquery)...
działa. Podzapytanie jest zapytaniem skorelowanym, ponieważ jegoWHERE
klauzula używaEmp1
zapytania głównego. Podzapytanie jest oceniane za każdym razem, gdy główne zapytanie skanuje wiersz. Na przykład, jeśli mamy znaleźć trzecią co do wielkości pensję (N = 3) z (800, 1000, 700, 750), podzapytanie w pierwszym wierszu będzie wynosićSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0. Dla czwartego wynagrodzenia (750)... WHERE Emp2.Salary > 750
będzie to 2 lub N -1, stąd ten wiersz zostanie zwrócony.Spróbuj tego
Za 3 możesz zamienić dowolną wartość ...
źródło
Jeśli chcesz zoptymalizować sposób, użyj słowa
TOP
kluczowego, więc n-te maksymalne i minimalne zapytanie o pensje w następujący sposób, ale zapytania wyglądają na trudne, jak w odwrotnej kolejności, używając nazw funkcji agregujących:Wynagrodzenie maksymalne N:
dla Ex: 3 maksymalne wynagrodzenie:
Wynagrodzenie minimalne:
dla Ex: 3 minimalne wynagrodzenie:
źródło
Zbyt proste, jeśli używasz zapytania podrzędnego!
Możesz tutaj po prostu zmienić n-tą wartość po ograniczeniu LIMIT.
Tutaj w tym kwerendzie podrzędnej Wybierz EmpSalary z zamówienia pracownika przez EmpSalary DESC Limit 3; zwróci 3 najwyższe pensje Pracowników. Z wyniku wybierzemy Minimalne wynagrodzenie za pomocą komendy MIN, aby otrzymać 3. TOP wynagrodzenie pracownika.
źródło
Zastąp N swoim maksymalnym numerem
Wyjaśnienie
Powyższe zapytanie może być dość mylące, jeśli wcześniej nie widziałeś czegoś podobnego - wewnętrzne zapytanie to tak zwane skorelowane zapytanie podrzędne, ponieważ zapytanie wewnętrzne (podzapytanie) używa wartości z zapytania zewnętrznego (w tym przypadku tabeli Emp1 ) w klauzuli WHERE.
I źródło
źródło
... WHERE (N-1) = (Subquery)...
działa. Podzapytanie jest zapytaniem skorelowanym, ponieważ jegoWHERE
klauzula używaEmp1
zapytania głównego. Podzapytanie jest oceniane za każdym razem, gdy główne zapytanie skanuje wiersz. Na przykład, jeśli mamy znaleźć trzecią co do wielkości pensję (N = 3) z (800, 1000, 700, 750), podzapytanie dla pierwszego wiersza będzieSELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
równe 0. Dla czwartego wynagrodzenia (750)... WHERE Emp2.Salary > 750
będzie wynosić 2 lub N -1, stąd ten wiersz zostanie zwrócony.Trzecie lub n-te maksymalne wynagrodzenie z tabeli wynagrodzeń bez korzystania z podzapytania
W przypadku trzeciego najwyższego wynagrodzenia umieść 2 na miejscu N-1
źródło
źródło
Aby uzyskać n-tą najwyższą pensję, zapoznaj się z poniższym zapytaniem. W ten sposób otrzymujesz n-tą najwyższą pensję w MYSQL. Jeśli chcesz otrzymać tylko n-tą najniższą pensję, musisz w zapytaniu zamienić DESC na ASC.
źródło
źródło
Metoda 1:
Metoda 2:
źródło
W 2008 roku możemy użyć ROW_NUMBER () OVER (ORDER BY EmpSalary DESC), aby uzyskać rangę bez powiązań, której możemy użyć.
Na przykład możemy w ten sposób uzyskać 8 miejsce od najwyższego lub zmienić @N na coś innego lub użyć go jako parametru w funkcji, jeśli chcesz.
W SQL Server 2012, jak być może wiesz, jest to wykonywane bardziej intuicyjnie przy użyciu funkcji LAG ().
źródło
źródło
To jedno z popularnych pytań w każdym wywiadzie SQL. Mam zamiar zapisać różne zapytania, aby znaleźć n-tą najwyższą wartość kolumny.
Utworzyłem tabelę o nazwie „Pracownik”, uruchamiając poniższy skrypt.
Teraz wstawię 8 wierszy do tej tabeli, uruchamiając poniższą instrukcję wstawiania.
Teraz dowiemy się trzeciego najwyższego Basic_sal z powyższej tabeli przy użyciu różnych zapytań. Uruchomiłem poniższe zapytanie w studio zarządzania i poniżej jest wynik.
Na powyższym obrazku widzimy, że trzecia najwyższa pensja podstawowa wynosiłaby 8500. Piszę 3 różne sposoby, aby zrobić to samo. Wykonując wszystkie trzy wymienione poniżej zapytania otrzymamy ten sam wynik, tj. 8500.
Pierwszy sposób: - Korzystanie z funkcji numeru wiersza
źródło
Pokazuję trzecią najwyższą pensję
źródło
źródło
- nn najwyższe wynagrodzenie
- (nth -1) najwyższe wynagrodzenie
źródło
Zoptymalizowany sposób: zamiast podzapytania użyj limitu.
Zobacz składnię limitów tutaj http://www.mysqltutorial.org/mysql-limit.aspx
źródło
Aby uzyskać trzecią najwyższą wartość z tabeli
źródło
Według podzapytania:
źródło
Spróbuj tego zapytania
Wpisz n = żądaną wartość
źródło
źródło
Rozwiązanie przetestowane przez MySQL, załóżmy, że N = 4:
Inny przykład:
źródło
Wypróbuj ten kod: -
źródło
Zastąp n n-tą najwyższą pensją jako liczbą.
źródło
Spróbuj tego...
źródło
Dla drugiego najwyższego wynagrodzenia zmień 3 na 2 w powyższym zapytaniu, a dla N-tego najwyższego wynagrodzenia na N, gdzie N = 1,2,3,4 ....
źródło
SELECT * FROM (wybierz odrębne wynagrodzenie od klientów w kolejności według wynagrodzenia DESC) limit 4,1;
Limit 4,1 oznacza pozostawienie pierwszych 4 rzędów, a następnie wybranie następnego.
Limit i numer referencyjny zależą od używanej platformy.
Spróbuj tego, to zadziała.
źródło
UWAGA: Proszę zastąpić PRZESUNIĘCIE 3 w zapytaniu DOWOLNĄ N-tą liczbą całkowitą
Opis
zwróć tylko 1 wiersz
wyklucz pierwsze 3 rekordy Tutaj możesz wybrać dowolną liczbę całkowitą
źródło
Podzapytania zawsze zajmują więcej czasu:
użyj poniższego zapytania, aby uzyskać najwyższe i najniższe dane:
Najwyższe dane:
select *from business order by id desc limit 3,1;
Najniższe dane:
select *from business order by id asc limit 3,1;
Można użyć N zamiast 3, aby uzyskać n-te dane.
źródło