Wie finde ich das dritte oder n-te Höchstgehalt aus der Gehaltsliste?

Antworten:

82

Verwenden Sie ROW_NUMBER(wenn Sie eine einzelne möchten) oder DENSE_RANK(für alle zugehörigen Zeilen):

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
quelle
Wie bekomme ich einen Mindestlohnrekord vom Tisch? Wählen Sie ins.KYS_ID, ins.FKYS_INS_ID aus cmn_pat_x_insurance ins, wobei ins.FKYS_PAT_ID = '1253_717' und ins.FKYS_INS_TYPE in (1) und ins.BOL_TYPE in (1,3) und ins.salary in (min (ins.salary)).
sagte Kilaru
Stellen Sie sich vor, die Mitarbeitertabelle enthält 10.0000 Datensätze. Wenn ich die obige Abfrage verwende, wird die Leistung um das 6-10-fache reduziert.
Bimal Das
1
@BimalDas: Dann haben Sie keinen Index für die EmpSalarySpalte. Auch reduziert im Vergleich zu was? Der Vorteil des ROW_NUMBERAnsatzes ist, dass Sie verwenden können ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn). Sie können es also verwenden, um Gruppen abzurufen und trotzdem auf eine beliebige Spalte davon zuzugreifen.
Tim Schmelter
@TimSchmelter WITH CTE erstellt eine temporäre Tabelle, in der die gesamten Daten der ersten SELECT-Anweisung gespeichert werden. Anschließend wählen wir aus dem Ergebnis "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow" aus. Deshalb denke ich, dass es etwas langsam ist. Ich habe nachgeschaut. und ich habe auch die richtige Indizierung.
Bimal Das
2
@BimalDas: Nein, es wird keine temporäre Tabelle erstellt. Ein cte wird normalerweise nirgendwo materialisiert. Es ist eher eine Inline-Ansicht oder eine benannte Unterabfrage.
Tim Schmelter
88

Zeilennummer :

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)

Unterabfrage:

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
               SELECT COUNT(DISTINCT(Emp2.Salary))
               FROM Employee Emp2
               WHERE Emp2.Salary > Emp1.Salary
               )

Top Keyword:

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary
Kumar Manish
quelle
Wie bekomme ich einen Mindestlohnrekord vom Tisch? Wählen Sie ins.KYS_ID, ins.FKYS_INS_ID aus cmn_pat_x_insurance ins, wobei ins.FKYS_PAT_ID = '1253_717' und ins.FKYS_INS_TYPE in (1) und ins.BOL_TYPE in (1,3) und ins.salary in (min (ins.salary)).
sagte Kilaru
Kumar und Alexander, ich möchte noch ein Feld damit haben, wie geht das? Meine Abfrage ist wie "" Wählen Sie die Top 1 NoteID aus (Wählen Sie DateDiff (Year, SchedualDate, Current_TimeStamp) als NoteAge, Distinct Top 3 NoteID von [dbo]. [DocSecheduale] Order by NoteID Desc) a Order by NoteID ""
Zaveed Abbasi
Ich finde das n-te höchste Gehalt, aber ich bekomme Komplexität, um die Unterabfrage zu verstehen. Möchten Sie die Unterabfrage erklären ...
Deepak Gupta
@deepak_java Die Unterabfrage wird jedes Mal ausgewertet, wenn eine Zeile von der äußeren Abfrage verarbeitet wird. Mit anderen Worten, die innere Abfrage kann nicht unabhängig von der äußeren Abfrage verarbeitet werden, da die innere Abfrage ebenfalls den Emp1-Wert verwendet.
Kumar Manish
Es ist wichtig zu verstehen, warum das ... WHERE (N-1) = (Subquery)...funktioniert. Die Unterabfrage ist eine korrelierte Abfrage, da ihre WHEREKlausel die Emp1Hauptabfrage verwendet. Die Unterabfrage wird jedes Mal ausgewertet, wenn die Hauptabfrage eine Zeile durchsucht. Wenn wir beispielsweise das drittgrößte Gehalt (N = 3) aus (800, 1000, 700, 750) ermitteln möchten, wäre die Unterabfrage für die 1. Zeile SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 8000. Für das 4. Gehalt ist der Wert (750) ... WHERE Emp2.Salary > 7502 oder N. -1, daher wird diese Zeile zurückgegeben.
Jerrymouse
65

Versuche dies

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

Für 3 können Sie einen beliebigen Wert ersetzen ...

Codesen
quelle
funktioniert das mit oracle 10g oder 11g? Oder gibt es eine Alternative, die so ziemlich ist?
RBz
40

Wenn Sie den Weg optimieren möchten, müssen Sie das TOPSchlüsselwort verwenden. Die Abfrage des n-ten maximalen und minimalen Gehalts lautet also wie folgt: Die Abfragen sehen jedoch in umgekehrter Reihenfolge schwierig aus, wenn Sie aggregierte Funktionsnamen verwenden:

N maximales Gehalt:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

zum Beispiel: 3 maximales Gehalt:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

N Mindestgehalt:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)

zum Beispiel: 3 Mindestgehalt:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Rajesh Pathakoti
quelle
Am einfachsten und am einfachsten zu merken. +1
Sнаđошƒаӽ
4
Um das maximale Gehalt zu erhalten, warum wir in ASC-Reihenfolge arbeiten, muss es in DESC-Reihenfolge erfolgen. Wenn wir ein Gehalt wie dieses 7000.10000.11000.500.800.900.12000 haben, führt die innere Abfrage der Sortierung zu top3, was 500.800.900 bedeutet und maximal von diesen ist 900, aber 900 ist nicht das 3 Maximum, 3 maximales Gehalt ist 10000.
Narendra Jaggi
1
Beispiel: 3 maximale Gehälter: Es muss so sein: SELECT Min (EmpSalary) FROM Salary WHERE EmpSalary IN (SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Jimit Rupani
15

Zu einfach, wenn Sie die Unterabfrage verwenden!

SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);

Sie können hier einfach den n-ten Wert nach der LIMIT-Einschränkung ändern.

Hier in dieser Unterabfrage Wählen Sie EmpSalary aus der Mitarbeiterreihenfolge nach EmpSalary DESC Limit 3 aus. würde die Top 3 Gehälter der Mitarbeiter zurückgeben. Aus dem Ergebnis wählen wir das Mindestgehalt mit dem Befehl MIN aus, um das 3. TOP-Gehalt des Mitarbeiters zu erhalten.

anonxss
quelle
Diesen Fehler erhalten. Fehlercode: 1248 Jede abgeleitete Tabelle muss einen eigenen Alias ​​haben
Fügen Sie einen Alias ​​hinzu. SELECT MIN (EmpSalary) von (SELECT EmpSalary vom Mitarbeiter ORDER BY EmpSalary DESC LIMIT 3) as s;
anonxss
Verwenden Sie einfach DISTINCT, um Duplikate zu vermeiden. SELECT MIN (EmpSalary) von (SELECT DISTINCT (EmpSalary) von Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh
14

Ersetzen Sie N durch Ihre maximale Anzahl

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

Erläuterung

Die obige Abfrage kann ziemlich verwirrend sein, wenn Sie so etwas noch nicht gesehen haben. Die innere Abfrage wird als korrelierte Unterabfrage bezeichnet, da die innere Abfrage (die Unterabfrage) einen Wert aus der äußeren Abfrage (in diesem Fall die Emp1-Tabelle) verwendet ) in der WHERE-Klausel.

Und Quelle

Luv
quelle
+1 Es ist wichtig zu verstehen, warum das ... WHERE (N-1) = (Subquery)...funktioniert. Die Unterabfrage ist eine korrelierte Abfrage, da ihre WHEREKlausel die Emp1Hauptabfrage verwendet. Die Unterabfrage wird jedes Mal ausgewertet, wenn die Hauptabfrage eine Zeile durchsucht. Wenn wir beispielsweise das drittgrößte Gehalt (N = 3) aus (800, 1000, 700, 750) ermitteln möchten, wäre die Unterabfrage für die 1. Zeile SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 8000. Für das 4. Gehalt ist der Wert (750) ... WHERE Emp2.Salary > 7502 oder N. -1, daher wird diese Zeile zurückgegeben.
Jerrymouse
13

Drittes oder n-te maximales Gehalt aus der Gehaltstabelle ohne Unterabfrage

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

Für das dritthöchste Gehalt setzen Sie 2 anstelle von N-1

Darvi Sunny
quelle
3
Es ist wichtig zu erwähnen, dass OFFSET FETCH ab SQL Server 2012 + verfügbar ist.
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
quelle
1
Danke für DENSE_RANK (), ich habe noch nie davon gehört
Vivekh
8

Beziehen Sie sich auf die folgende Abfrage, um das n-te höchste Gehalt zu erhalten. Auf diese Weise erhalten Sie das n-te höchste Gehalt in MYSQL. Wenn Sie nur das n-te niedrigste Gehalt erhalten möchten, müssen Sie DESC in der Abfrage durch ASC ersetzen. n-te höchstes Gehalt

Vijay Bhatt
quelle
1
Die Frage betrifft SQL-Server, nicht MySQL.
Bummi
8
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Saurabh Chandra Patel
quelle
6

Methode 1:

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

Methode 2:

  Select EmpName,salary from
  (
    select EmpName,salary ,Row_Number() over(order by salary desc) as rowid      
     from EmpTbl)
   as a where rowid=3

quelle
Methode 1 kann sortiert werden: SELECT TOP 1 SALARY FROM (SELECT TOP 3 SALARY FROM EMPLOYEES) * Grund - weil standardmäßig seine aufsteigende Reihenfolge
Ashish Agrawal Yodlee
5

Im Jahr 2008 können wir ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) verwenden, um einen Rang ohne Bindungen zu erhalten, die wir verwenden können.

Zum Beispiel können wir auf diese Weise die achthöchste erreichen oder @N in etwas anderes ändern oder es als Parameter in einer Funktion verwenden, wenn Sie möchten.

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;

Wie Sie vielleicht wissen, wird dies in SQL Server 2012 mit LAG () intuitiver ausgeführt.

David Söderlund
quelle
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
quelle
Ändern Sie möglicherweise Druck, um auszuwählen
Tomas Pastircak
3

Dies ist eine der beliebtesten Fragen in jedem SQL-Interview. Ich werde verschiedene Abfragen aufschreiben, um den n-ten höchsten Wert einer Spalte herauszufinden.

Ich habe eine Tabelle mit dem Namen "Emloyee" erstellt, indem ich das folgende Skript ausgeführt habe.

CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)

Jetzt werde ich 8 Zeilen in diese Tabelle einfügen, indem ich die Anweisung insert ausführe.

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)

Jetzt werden wir den dritthöchsten Basic_sal aus der obigen Tabelle mit verschiedenen Abfragen herausfinden. Ich habe die folgende Abfrage in Management Studio ausgeführt und unten ist das Ergebnis.

select * from Employee order by Basic_Sal desc

Wir können im obigen Bild sehen, dass das dritthöchste Grundgehalt 8500 betragen würde. Ich schreibe 3 verschiedene Arten, dasselbe zu tun. Wenn Sie alle drei unten genannten Abfragen ausführen, erhalten Sie das gleiche Ergebnis, dh 8500.

Erster Weg: - Verwenden der Zeilennummernfunktion

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
quelle
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;

Ich zeige das dritthöchste Gehalt

kiran lanke
quelle
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
quelle
3

- das höchste Gehalt

select * 
from (select lstName, salary, row_number() over( order by salary desc) as rn 
      from employee) tmp
where rn = 2

- (n-te -1) höchstes Gehalt

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )
Surya-AIS
quelle
3

Optimierte Methode: Verwenden Sie anstelle der Unterabfrage nur limit.

select distinct salary from employee order by salary desc limit nth, 1;

Siehe Limit-Syntax hier http://www.mysqltutorial.org/mysql-limit.aspx

Kishor Vitekar
quelle
Ja! Es ist eine sehr einfache und saubere Lösung.
Avnish alok
3

Um den dritthöchsten Wert aus der Tabelle zu erhalten

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Jitendra Rajput
quelle
SELECT Distinct columnName FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Devendra Singraul
2

Durch Unterabfrage:

SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Sakib Ahammed
quelle
1

Versuchen Sie diese Abfrage

SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary) 
FROM emp WHERE E.salary <= salary)

Setzen Sie n = den gewünschten Wert

Mayur Sawant
quelle
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
quelle
1

MySQL-getestete Lösung, angenommen N = 4:

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

Ein anderes Beispiel:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);
Charlie
quelle
1

Versuchen Sie diesen Code: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )
Deepak Kumar
quelle
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);

Ersetzen Sie n durch das n-te höchste Gehalt als Zahl.

Ajay Singh Meena
quelle
0

Probier diese...

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

Ändern Sie für das zweithöchste Gehalt 3 zu 2 in der obigen Abfrage und für das n-te höchste Gehalt in N, wobei N = 1,2,3,4 ....

Lerner
quelle
0

SELECT * FROM (wählen Sie ein unterschiedliches Gehalt aus der Kundenbestellung nach Gehalt DESC) Limit 4,1;

Limit 4,1 bedeutet, dass Sie die ersten 4 Zeilen verlassen und dann die nächste auswählen.

Limit und Rownumber hängen von der verwendeten Plattform ab.

Versuchen Sie dies, es wird funktionieren.

Saif Grover
quelle
0

HINWEIS: Bitte ersetzen Sie OFFSET 3 in Query durch eine beliebige n- te Ganzzahl

SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS 
FETCH NEXT 1 ROWS ONLY

Beschreibung

NUR DIE NÄCHSTEN 1 REIHEN ERHALTEN

Geben Sie nur 1 Zeile zurück

OFFSET 3 REIHEN

erste 3 Datensätze ausschließen Hier können Sie eine beliebige Ganzzahl eingeben

Hardik Masalawala
quelle
0

Unterabfragen brauchen immer mehr Zeit:

Verwenden Sie die folgende Abfrage, um die höchsten und niedrigsten Daten zu erhalten:

Höchste Daten: select *from business order by id desc limit 3,1;

Niedrigste Daten: select *from business order by id asc limit 3,1;

Kann N anstelle von 3 verwenden, um n-te Daten zu erhalten.

Ankit Gupta
quelle