Jak znaleźć third or nth
maksymalne wynagrodzenie z pensji table(EmpID,EmpName,EmpSalary)
w zoptymalizowany sposób?
Jak znaleźć third or nth
maksymalne wynagrodzenie z pensji table(EmpID,EmpName,EmpSalary)
w zoptymalizowany sposób?
Odpowiedzi:
Użyj ROW_NUMBER
(jeśli chcesz jeden) lub DENSE_RANK
(dla wszystkich powiązanych wierszy):
WITH CTE AS
(
SELECT EmpID, EmpName, EmpSalary,
RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow
EmpSalary
kolumnie. Również zredukowane w porównaniu do czego? Zaletą tego ROW_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 :
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
FROM EMPLOYEE
) As A
WHERE A.RowNum IN (2,3)
Zapytanie podrzędne:
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
Najpopularniejsze słowo kluczowe:
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
... WHERE (N-1) = (Subquery)...
działa. Podzapytanie jest zapytaniem skorelowanym, ponieważ jego WHERE
klauzula używa Emp1
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.
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:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
dla Ex: 3 maksymalne wynagrodzenie:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Wynagrodzenie minimalne:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
dla Ex: 3 minimalne wynagrodzenie:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Zbyt proste, jeśli używasz zapytania podrzędnego!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
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.
Zastąp N swoim maksymalnym numerem
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
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
... WHERE (N-1) = (Subquery)...
działa. Podzapytanie jest zapytaniem skorelowanym, ponieważ jego WHERE
klauzula używa Emp1
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ędzie SELECT 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
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
W przypadku trzeciego najwyższego wynagrodzenia umieść 2 na miejscu N-1
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
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.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Metoda 1:
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Metoda 2:
Select EmpName,salary from
(
select EmpName,salary ,Row_Number() over(order by salary desc) as rowid
from EmpTbl)
as a where rowid=3
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.
DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;
W SQL Server 2012, jak być może wiesz, jest to wykonywane bardziej intuicyjnie przy użyciu funkcji LAG ().
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
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.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
Teraz wstawię 8 wierszy do tej tabeli, uruchamiając poniższą instrukcję wstawiania.
insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)
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.
select * from Employee order by Basic_Sal desc
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
select Ename,Basic_sal
from(
select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
)A
where rowid=2
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;
Pokazuję trzecią najwyższą pensję
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
- nn najwyższe wynagrodzenie
select *
from (select lstName, salary, row_number() over( order by salary desc) as rn
from employee) tmp
where rn = 2
- (nth -1) najwyższe wynagrodzenie
select *
from employee e1
where 1 = (select count(distinct salary)
from employee e2
where e2.Salary > e1.Salary )
Zoptymalizowany sposób: zamiast podzapytania użyj limitu.
select distinct salary from employee order by salary desc limit nth, 1;
Zobacz składnię limitów tutaj http://www.mysqltutorial.org/mysql-limit.aspx
Aby uzyskać trzecią najwyższą wartość z tabeli
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Według podzapytania:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Spróbuj tego zapytania
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
Wpisz n = żądaną wartość
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Wypróbuj ten kod: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
select * from employee order by salary desc;
+------+------+------+-----------+
| id | name | age | salary |
+------+------+------+-----------+
| 5 | AJ | 20 | 100000.00 |
| 4 | Ajay | 25 | 80000.00 |
| 2 | ASM | 28 | 50000.00 |
| 3 | AM | 22 | 50000.00 |
| 1 | AJ | 24 | 30000.00 |
| 6 | Riu | 20 | 20000.00 |
+------+------+------+-----------+
select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);
Zastąp n n-tą najwyższą pensją jako liczbą.
Spróbuj tego...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
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.
UWAGA: Proszę zastąpić PRZESUNIĘCIE 3 w zapytaniu DOWOLNĄ N-tą liczbą całkowitą
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
Opis
POBIERZ TYLKO NASTĘPNE 1 WIERSZE
zwróć tylko 1 wiersz
PRZESUNIĘCIE 3 RZĘDY
wyklucz pierwsze 3 rekordy Tutaj możesz wybrać dowolną liczbę całkowitą
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.