Come trovare lo third or nth
stipendio massimo dallo stipendio table(EmpID,EmpName,EmpSalary)
in modo ottimizzato?
Come trovare lo third or nth
stipendio massimo dallo stipendio table(EmpID,EmpName,EmpSalary)
in modo ottimizzato?
Risposte:
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
EmpSalary
colonna. Inoltre, ridotto rispetto a cosa? Il vantaggio ROW_NUMBER
dell'approccio è che puoi usare ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Quindi puoi usarlo per ottenere gruppi ma comunque accedere a qualsiasi colonna di esso.
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
... WHERE (N-1) = (Subquery)...
funziona. La sottoquery è una query correlata poiché la sua WHERE
clausola utilizza Emp1
dalla 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 > 800
0. Per il quarto salario il valore (750) ... WHERE Emp2.Salary > 750
sarà 2 o N -1, quindi questa riga verrà restituita.
Se vuoi ottimizzare il modo significa usare la TOP
parola 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)
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.
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
... WHERE (N-1) = (Subquery)...
funziona. La sottoquery è una query correlata poiché la sua WHERE
clausola utilizza Emp1
dalla 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 > 800
0. Per il quarto salario il valore (750) ... WHERE Emp2.Salary > 750
sarà 2 o N -1, quindi questa riga verrà restituita.
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
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
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.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
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 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 ().
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. 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
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
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
- 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 )
Modo ottimizzato: invece di sottoquery usa solo limit.
select distinct salary from employee order by salary desc limit nth, 1;
Vedere la sintassi del limite qui http://www.mysqltutorial.org/mysql-limit.aspx
Per ottenere il terzo valore più alto dalla tabella
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Per sottoquery:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
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
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Prova questo codice: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
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.
Prova questo...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
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à.
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
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.