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

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

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


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)

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.


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


+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


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

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


1
Die Frage betrifft SQL-Server, nicht MySQL.
Bummi


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

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.


4
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal

Ä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

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


3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'

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 )


3

Um den dritthöchsten Wert aus der Tabelle zu erhalten

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1

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)

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


1
set @n = $n

SELECT a.* FROM ( select a.* , @rn = @rn+1  from EMPLOYEE order by a.EmpSalary desc ) As a  where rn = @n

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

1

Versuchen Sie diesen Code: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )

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.


0

Probier diese...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)

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


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.


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.