Jak znaleźć trzecią lub n. Maksymalną pensję z tabeli wynagrodzeń?

Odpowiedzi:

82

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
Tim Schmelter
źródło
jak uzyskać rekord minimalnego wynagrodzenia z tabeli? wybierz ins.KYS_ID, ins.FKYS_INS_ID z cmn_pat_x_insurance ins, gdzie ins.FKYS_PAT_ID = '1253_717' i ins.FKYS_INS_TYPE w (1) i ins.BOL_TYPE w (1,3) i ins.salary w (min (ins.salary))
saidesh kilaru,
Wyobraź sobie, że w tabeli pracowników jest 10000 rekordów. Jeśli użyję powyższego zapytania, wydajność zostanie zmniejszona o 6-10 razy.
Bimal Das
1
@BimalDas: wtedy nie masz indeksu w EmpSalarykolumnie. Również zredukowane w porównaniu do czego? Zaletą tego ROW_NUMBERpodejś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.
Tim Schmelter
@TimSchmelter WITH CTE utworzy tymczasową tabelę do przechowywania w niej całych danych pierwszej instrukcji SELECT, a następnie z wyniku wybieramy „SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow”. Dlatego myślę, że jest trochę powolny. Sprawdziłem to. i mam też odpowiednie indeksowanie.
Bimal Das
2
@BimalDas: Nie, to nie jest tworzenie tymczasowej tabeli. Cte zwykle nie jest nigdzie zmaterializowane. To bardziej przypomina widok wbudowany lub nazwane podzapytanie.
Tim Schmelter
88

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
Kumar Manish
źródło
jak uzyskać rekord minimalnego wynagrodzenia z tabeli? wybierz ins.KYS_ID, ins.FKYS_INS_ID z cmn_pat_x_insurance ins, gdzie ins.FKYS_PAT_ID = '1253_717' i ins.FKYS_INS_TYPE w (1) i ins.BOL_TYPE w (1,3) i ins.salary w (min (ins.salary))
saidesh kilaru,
Kumar i Alexander, chcę mieć z tym jeszcze jedno pole, jak to zrobić? moje zapytanie jest podobne do "" "Wybierz pierwsze pierwsze NoteID od (Wybierz DateDiff (Year, SchedualDate, Current_TimeStamp) as NoteAge, Distinct Top 3 NoteID z [dbo]. [DocSecheduale] Order by NoteID Desc) a Order by NoteID" ""
Zaveed Abbasi,
Jestem znalezienie ntą najwyższe wynagrodzenie, ale otrzymuję złożoność zrozumieć sub-zapytanie, chciałbyś wyjaśnić pod-zapytanie ...
Deepak Gupta
@deepak_java podzapytanie jest oceniane za każdym razem, gdy wiersz jest przetwarzany przez zapytanie zewnętrzne. Innymi słowy, zapytanie wewnętrzne nie może być przetwarzane niezależnie od zapytania zewnętrznego, ponieważ zapytanie wewnętrzne również używa wartości Emp1.
Kumar Manish
Ważne jest, aby zrozumieć, dlaczego to ... WHERE (N-1) = (Subquery)...działa. Podzapytanie jest zapytaniem skorelowanym, ponieważ jego WHEREklauzula używa Emp1zapytania 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 > 8000. Dla czwartego wynagrodzenia (750) ... WHERE Emp2.Salary > 750będzie to 2 lub N -1, stąd ten wiersz zostanie zwrócony.
jerrymouse
65

Spróbuj tego

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM employees 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

Za 3 możesz zamienić dowolną wartość ...

Codesen
źródło
czy to działa z Oracle 10g czy 11g? A może istnieje alternatywa, która jest podobna do tej?
RBz
40

Jeśli chcesz zoptymalizować sposób, użyj słowa TOPkluczowego, 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)
Rajesh Pathakoti
źródło
Najprostsze i najłatwiejsze do zapamiętania. +1
Sнаđошƒаӽ
4
aby uzyskać maksymalną pensję, dlaczego robimy w kolejności ASC, należy to zrobić w kolejności DESC, jeśli mamy taką pensję 7000,10000,11000,500,800,900,12000, to wewnętrzne zapytanie sortowania da wynik top3, czyli 500,800,900 a maksymalna z nich to 900, ale 900 to nie 3 maksimum, 3 maksymalna pensja to 10000.
Narendra Jaggi
1
dla Ex: 3 maksymalne pensje: Tak musi być SELECT Min (EmpSalary) FROM Salary WHERE EmpSalary IN (SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Jimit Rupani
15

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.

anonxss
źródło
Pojawia się ten błąd. Kod błędu: 1248 Każda tabela pochodna musi mieć swój własny alias
dodaj do niego alias. SELECT MIN (EmpSalary) z (SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3) as s;
anonxss
Po prostu użyj DISTINCT, aby uniknąć duplikatów SELECT MIN (EmpSalary) z (SELECT DISTINCT (EmpSalary) from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh
14

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

Luv
źródło
+1 Ważne jest, aby zrozumieć, dlaczego to ... WHERE (N-1) = (Subquery)...działa. Podzapytanie jest zapytaniem skorelowanym, ponieważ jego WHEREklauzula używa Emp1zapytania 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 > 800równe 0. Dla czwartego wynagrodzenia (750) ... WHERE Emp2.Salary > 750będzie wynosić 2 lub N -1, stąd ten wiersz zostanie zwrócony.
jerrymouse
13

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

Darvi Sunny
źródło
3
Należy wspomnieć, że OFFSET FETCH jest dostępny od wersji SQL Server 2012 +.
Zerotoinfinity
11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Pankaj Gaikwad
źródło
1
Dzięki za DENSE_RANK () nigdy o tym nie słyszałem
Vivekh
8

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. n-ta najwyższa pensja

Vijay Bhatt
źródło
1
Pytanie dotyczy SQL-Server, a nie MySQL.
bummi
8
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Saurabh Chandra Patel
źródło
6

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

źródło
Metoda 1 może być sortowana: WYBIERZ TOP 1 PŁACĘ Z (WYBIERZ TOP 3 PŁACĘ OD PRACOWNIKÓW) * powód - ponieważ domyślnie jest to kolejność rosnąca
Ashish Agrawal Yodlee
5

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 ().

David Söderlund
źródło
4
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal
Uma Shankar Lakhera
źródło
Potencjalnie zmień druk na wybrany
Tomas Pastircak
3

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
Neeraj Kumar Yadav
źródło
3
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ę

kiran lanke
źródło
3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'
Vikas Joshi
źródło
3

- 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 )
Surya-AIS
źródło
3

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

Kishor Vitekar
źródło
Tak! to bardzo proste i przejrzyste rozwiązanie.
Avnish alok
3

Aby uzyskać trzecią najwyższą wartość z tabeli

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
jitendra rajput
źródło
SELECT Distinct columnName FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Devendra Singraul
2

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)
Sakib Ahammed
źródło
1

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ść

Mayur Sawant
źródło
1
set @n = $n

SELECT a.* FROM ( select a.* , @rn = @rn+1  from EMPLOYEE order by a.EmpSalary desc ) As a  where rn = @n
Saurabh Chandra Patel
źródło
1

Rozwiązanie przetestowane przez MySQL, załóżmy, że N = 4:

select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;

Inny przykład:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);
Charlie
źródło
1

Wypróbuj ten kod: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )
Deepak Kumar
źródło
1
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ą.

Ajay Singh Meena
źródło
0

Spróbuj tego...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
Deepak Kumar
źródło
0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

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

uczeń
źródło
0

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.

Saif Grover
źródło
0

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ą

Hardik Masalawala
źródło
0

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.

Ankit Gupta
źródło