Come trovare il terzo o l'ennesimo stipendio massimo dalla tabella degli stipendi?


Risposte:


82

Usa ROW_NUMBER(se vuoi una singola) o DENSE_RANK(per tutte le righe correlate):

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

come ottenere il record di stipendio minimo dal tavolo? selezionare ins.KYS_ID, ins.FKYS_INS_ID da cmn_pat_x_insurance ins dove ins.FKYS_PAT_ID = '1253_717' e ins.FKYS_INS_TYPE in (1) e ins.BOL_TYPE in (1,3) e ins.salary in (min (ins.salary))
saidesh kilaru

Immagina, ci sono 10.0000 record nella tabella dei dipendenti. Se utilizzo la query precedente, le prestazioni saranno ridotte di 6-10 volte.
Bimal Das

1
@BimalDas: allora non hai un indice sulla EmpSalarycolonna. Inoltre, ridotto rispetto a cosa? Il vantaggio ROW_NUMBERdell'approccio è che puoi usare ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn). Quindi puoi usarlo per ottenere gruppi ma comunque accedere a qualsiasi colonna di esso.
Tim Schmelter

@TimSchmelter WITH CTE creerà una tabella temporanea per memorizzare in essa tutti i dati della prima istruzione SELECT, quindi dal risultato selezioneremo "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow". Ecco perché immagino che sia un po 'lento. L'ho controllato. e ho anche un'indicizzazione adeguata.
Bimal Das

2
@BimalDas: No, non sta creando una tabella temporanea. Normalmente un cte non si materializza da nessuna parte. È più simile a una visualizzazione in linea o una sottoquery denominata.
Tim Schmelter

88

Numero di riga:

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)

Sottoquery:

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

Parola chiave principale:

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary

come ottenere il record di stipendio minimo dal tavolo? selezionare ins.KYS_ID, ins.FKYS_INS_ID da cmn_pat_x_insurance ins dove ins.FKYS_PAT_ID = '1253_717' e ins.FKYS_INS_TYPE in (1) e ins.BOL_TYPE in (1,3) e ins.salary in (min (ins.salary))
saidesh kilaru

Kumar e Alexander, voglio ottenere un altro campo con esso, come farlo? la mia query è del tipo "" "Seleziona Top 1 NoteID From (Seleziona DateDiff (Year, SchedualDate, Current_TimeStamp) come NoteAge, Distinct Top 3 NoteID From [dbo]. [DocSecheduale] Order by NoteID Desc) a Order by NoteID" ""
Zaveed Abbasi

Sto trovando l'ennesimo stipendio più alto ma sto diventando complicato per comprendere la sottoquery, vorresti spiegare la sottoquery ...
Deepak Gupta

@deepak_java la sottoquery viene valutata ogni volta che una riga viene elaborata dalla query esterna. In altre parole, la query interna non può essere elaborata indipendentemente dalla query esterna poiché anche la query interna utilizza il valore Emp1.
Kumar Manish

È importante capire perché ... WHERE (N-1) = (Subquery)...funziona. La sottoquery è una query correlata poiché la sua WHEREclausola utilizza Emp1dalla query principale. La sottoquery viene valutata ogni volta che la query principale esegue la scansione su una riga. Esempio, se dobbiamo trovare il terzo stipendio più grande (N = 3) da (800, 1000, 700, 750), la sottoquery per la prima riga sarebbe SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 8000. Per il quarto salario il valore (750) ... WHERE Emp2.Salary > 750sarà 2 o N -1, quindi questa riga verrà restituita.
jerrymouse

65

Prova questo

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

Per 3 puoi sostituire qualsiasi valore ...


funziona con Oracle 10g o 11g? O esiste un'alternativa che sia abbastanza simile a questa?
RBz

40

Se vuoi ottimizzare il modo significa usare la TOPparola chiave, quindi l'ennesimo salario massimo e minimo interroga come segue ma le query sembrano complicate poiché in ordine inverso utilizzando nomi di funzioni aggregate:

N stipendio massimo:

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

per Ex: 3 stipendio massimo:

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

N salario minimo:

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

per Ex: 3 salario minimo:

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

Il più semplice e il più facile da ricordare. +1
Sнаđошƒаӽ

4
per ottenere lo stipendio massimo perché stiamo facendo in ordine ASC, deve essere fatto in ordine DESC, se abbiamo uno stipendio come questo 7000,10000,11000,500,800,900,12000, la query interna di ordinamento risulterà in top3 che significa 500,800,900 e il massimo di questi è 900, ma 900 non è il massimo 3, il salario massimo 3 è 10000.
Narendra Jaggi

1
per Es: 3 stipendi massimi: Deve essere così SELEZIONA Min (EmpSalary) FROM Stipendio WHERE EmpSalary IN (SELEZIONA TOP 3 EmpSalary DA Stipendio ORDER BY EmpSalary DESC)
Jimit Rupani

15

Troppo semplice se usi la sottoquery!

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

Qui puoi semplicemente modificare l'ennesimo valore dopo il vincolo LIMIT.

Qui in questa la sottoquery Seleziona EmpSalary da Employee Order by EmpSalary DESC Limit 3; restituirebbe i primi 3 stipendi dei dipendenti. Dal risultato sceglieremo lo stipendio minimo utilizzando il comando MIN per ottenere il 3 ° stipendio MASSIMO del dipendente.


Ottenere questo errore. Codice di errore: 1248 Ogni tabella derivata deve avere il proprio alias

aggiungere un alias ad esso .. SELECT MIN (EmpSalary) from (SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3) as s;
anonxss

Basta usare DISTINCT per evitare duplicati SELECT MIN (EmpSalary) from (SELECT DISTINCT (EmpSalary) from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh

14

Sostituisci N con il tuo numero massimo

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

Spiegazione

La query sopra può creare confusione se non hai mai visto nulla di simile prima: la query interna è quella che viene chiamata sottoquery correlata perché la query interna (la sottoquery) utilizza un valore dalla query esterna (in questo caso la tabella Emp1 ) nella sua clausola WHERE.

E fonte


+1 È importante capire perché ... WHERE (N-1) = (Subquery)...funziona. La sottoquery è una query correlata poiché la sua WHEREclausola utilizza Emp1dalla query principale. La sottoquery viene valutata ogni volta che la query principale esegue la scansione su una riga. Esempio, se dobbiamo trovare il terzo stipendio più grande (N = 3) da (800, 1000, 700, 750), la sottoquery per la prima riga sarebbe SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 8000. Per il quarto salario il valore (750) ... WHERE Emp2.Salary > 750sarà 2 o N -1, quindi questa riga verrà restituita.
jerrymouse

13

Terzo o ennesimo stipendio massimo dalla tabella degli stipendi senza utilizzare la sottoquery

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

Per il 3 ° stipendio più alto, metti 2 al posto di N-1


3
È importante ricordare che OFFSET FETCH è disponibile dalla versione 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

1
Grazie per DENSE_RANK () non ne ho mai sentito parlare
Vivekh

8

Fare riferimento alla seguente query per ottenere l'ennesimo stipendio più alto. In questo modo ottieni l'ennesimo stipendio più alto in MYSQL. Se desideri ottenere solo l'ennesimo stipendio più basso, devi sostituire DESC con ASC nella query. ennesimo stipendio più alto


1
La domanda riguarda SQL-Server, non MySQL.
bummi


6

Metodo 1:

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

Metodo 2:

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

Il metodo 1 può essere ordinato: SELEZIONA LO STIPENDIO PRIMO 1 DA (SELEZIONA
LO STIPENDIO PRIMO

5

Nel 2008 possiamo usare ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) per ottenere un grado senza legami che possiamo usare.

Ad esempio, possiamo ottenere l'8 ° più alto in questo modo, o cambiare @N in qualcos'altro o usarlo come parametro in una funzione, se lo desideri.

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;

In SQL Server 2012, come forse saprai, questa operazione viene eseguita in modo più intuitivo utilizzando LAG ().


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

Potenzialmente cambia la stampa per selezionare
Tomas Pastircak

3

Questa è una delle domande più popolari in qualsiasi intervista SQL. Vado a scrivere diverse query per scoprire l'ennesimo valore più alto di una colonna.

Ho creato una tabella denominata "Emloyee" eseguendo lo script seguente.

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

Ora inserirò 8 righe in questa tabella eseguendo sotto l'istruzione insert.

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)

Ora scopriremo il terzo Basic_sal più alto dalla tabella sopra usando query diverse. Ho eseguito la query seguente in Management Studio e di seguito è riportato il risultato.

select * from Employee order by Basic_Sal desc

Possiamo vedere nell'immagine sopra che il terzo stipendio base più alto sarebbe 8500. Sto scrivendo 3 modi diversi per fare lo stesso. Eseguendo tutte e tre le query menzionate di seguito otterremo lo stesso risultato, ovvero 8500.

Primo modo: - Utilizzo della funzione numero di riga

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;

Sto mostrando il 3 ° stipendio più alto


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

3

- l'ennesimo stipendio più alto

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

- (n-esimo -1) stipendio più alto

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )


3

Per ottenere il terzo valore più alto dalla tabella

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

SELEZIONA Distinct columnName FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Devendra Singraul

2

Per sottoquery:

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

1

Prova questa query

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

Metti n = quale valore vuoi


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

Soluzione testata da MySQL, supponiamo che N = 4:

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

Un altro esempio:

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

1

Prova questo codice: -

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

Sostituisci n con l'ennesimo stipendio più alto come numero.


0

Prova questo...

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;

Per il 2 ° stipendio più alto, cambia 3 in 2 nella query sopra e per N-esimo stipendio più alto in N dove N = 1,2,3,4 ....


0

SELEZIONA * DA (seleziona stipendio distinto dall'ordine dei clienti per stipendio DESC) limite 4,1;

Limite 4,1 significa lasciare le prime 4 righe e quindi selezionare quella successiva.

Il limite e il numero di proprietà dipendono dalla piattaforma che stai utilizzando.

Prova questo, funzionerà.


0

NOTA: sostituire OFFSET 3 nella query con QUALSIASI ennesimo numero intero

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

Descrizione

SFOGLIA SOLO LE 1 RIGHE SUCCESSIVE

restituire solo 1 riga

OFFSET 3 RIGHE

escludi i primi 3 record Qui puoi inserire qualsiasi numero intero


0

Le sottoquery richiedono sempre più tempo:

usa la query sottostante per ottenere i dati più alti e più bassi:

Dati più alti: select *from business order by id desc limit 3,1;

Dati più bassi: select *from business order by id asc limit 3,1;

È possibile utilizzare N al posto di 3 per ottenere l'ennesimo dato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.