Come trovare il terzo o l’ennesimo stipendio dal tavolo degli stipendi?

Come trovare il third or nth stipendio dalla table(EmpID,EmpName,EmpSalary) stipendi table(EmpID,EmpName,EmpSalary) in modo ottimizzato?

Utilizza ROW_NUMBER (se desideri un singolo) 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 

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) 

Query secondaria:

 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 

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 …

Se si desidera ottimizzare la modalità significa utilizzare la parola chiave TOP , quindi l’ennesima richiesta di stipendi max e min come segue:

N stipendio minimo:

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

per Ex: 3 stipendio minimo:

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

N stipendio massimo:

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

per esempio: 3 stipendio massimo:

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

Terzo o nono stipendio massimo dalla tabella degli stipendi senza utilizzo di subquery

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

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

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ò essere abbastanza confusa se non hai mai visto nulla di simile prima – la query interna è quella che viene chiamata una 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

Troppo semplice se si utilizza la query secondaria!

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

Qui puoi semplicemente modificare l’ennesimo valore dopo il LIMIT limit.

Qui in questa la sottoscheda Seleziona EmpSalary da Employee Order per EmpSalary DESC Limit 3; restituirebbe i primi 3 salari dei Dipendenti. Al di fuori del risultato, sceglieremo lo stipendio minimo usando il comando MIN per ottenere il terzo stipendio TOP del dipendente.

 SELECT Salary,EmpName FROM ( SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE ) tbl WHERE Rno=3 

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 

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

Ad esempio possiamo ottenere l’ottavo 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 saprai, questo viene eseguito in modo più intuitivo tramite LAG ().

Fai riferimento alla seguente domanda per ottenere l’ennesimo salario più alto. In questo modo ottieni l’ennesimo salario più alto in MySQL. Se si desidera ottenere solo lo stipendio più basso, è necessario sostituire DESC tramite ASC nella query. ennesimo salario più alto

 SELECT EmpSalary FROM salary_table GROUP BY EmpSalary ORDER BY EmpSalary DESC LIMIT n-1, 1; 
 declare @maxNthSal as nvarchar(20) SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC print @maxNthSal 

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

Ho creato una tabella chiamata “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 la seguente 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 troveremo il 3 ° Basic_sal più alto dalla tabella sopra usando diverse query. Ho eseguito la query sottostante in Management Studio e di seguito è riportato il risultato.

 select * from Employee order by Basic_Sal desc 

Possiamo vedere nell’immagine sopra che il 3o Stipendio base più alto sarebbe 8500. Sto scrivendo 3 modi diversi di fare lo stesso. Eseguendo tutte e tre le query sottostanti otterremo lo stesso risultato, ad esempio 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 
 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 3o stipendio più alto

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

– il più alto stipendio

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

– (nth -1) salario più alto

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

Per sottoquery:

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

Modo ottimizzato: al posto della sottoquery basta usare il limite.

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

Vedi syntax dei limiti qui http://www.mysqltutorial.org/mysql-limit.aspx

Prova questa domanda

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

Metti n = quale valore vuoi

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

Soluzione testata MySQL, supponiamo 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); 

Per richiedere l’ nth highest bonus , ad esempio n=10 , utilizza AdventureWorks2012, Prova il codice seguente

 USE AdventureWorks2012; GO SELECT * FROM Sales.SalesPerson; GO DECLARE @grade INT; SET @grade = 10; SELECT MIN(Bonus) FROM (SELECT TOP (@grade) Bonus FROM (SELECT DISTINCT(Bonus) FROM Sales.SalesPerson) AS a ORDER BY Bonus DESC) AS g 

un altro modo per trovare gli ultimi dati più alti in base alla data

 SELECT A.JID,A.EntryDate,RefundDate,Comments,Refund, ActionBy FROM ( (select JID, Max(EntryDate) AS EntryDate from refundrequested GROUP BY JID) A Inner JOIN (SELECT JID,ENTRYDATE,refundDate,Comments,refund,ActionBy from refundrequested) B ON A.JID=B.JID AND A.EntryDate = B.EntryDate) 

Puoi provare questo:

 select top(1) EXPORT_NO from DC_HDR order by CASE when (ROW_NUMBER() over(order by EXPORT_NO desc))=3 then EXPORT_NO else 0 end desc 
 select min(salary) from (select salary from employee where rownum < n+1 order by salary desc); 

Mostrando tutto il 3o stipendio più alto:

 select * from emp where sal= (SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1) ; 

Mostrando solo il 3o stipendio più alto:

 SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1 

Prova questo…

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

Per il 2o stipendio più alto, Cambia 3 a 2 nella domanda precedente e per il quinto stipendio più alto a N dove N = 1,2,3,4 ....

SELEZIONA * DA (seleziona Salario distinto da Ordine clienti per salario DESC) limite 4,1;

Il limite 4,1 significa lasciare le prime 4 righe e poi selezionare il successivo.

Il limite e il rownumber dipendono dalla piattaforma che stai utilizzando.

Prova questo, funzionerà.