Como encontrar third or nth
salário máximo de salário de table(EmpID,EmpName,EmpSalary)
forma otimizada?
Como encontrar third or nth
salário máximo de salário de table(EmpID,EmpName,EmpSalary)
forma otimizada?
Respostas:
Use ROW_NUMBER
(se desejar) ou DENSE_RANK
(para todas as linhas relacionadas):
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
coluna. Além disso, reduzido em comparação com o quê? A vantagem da ROW_NUMBER
abordagem é que você pode usar ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Portanto, você pode usá-lo para obter grupos, mas ainda assim acessar qualquer coluna dele.
Número da linha:
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)
Sub Consulta:
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
Palavra-chave principal:
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
... WHERE (N-1) = (Subquery)...
funciona. A subconsulta é uma consulta correlacionada, pois sua WHERE
cláusula usa Emp1
da consulta principal. A subconsulta é avaliada cada vez que a consulta principal varre uma linha. Exemplo, se formos encontrar o 3º maior salário (N = 3) de (800, 1000, 700, 750), a subconsulta para a 1ª linha seria SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0. Para o 4º salário, o valor (750) ... WHERE Emp2.Salary > 750
será 2, ou N -1, portanto, esta linha será retornada.
Se você quiser otimizar a maneira, use TOP
palavra-chave. Portanto, a enésima consulta de salários máximos e mínimos da seguinte maneira, mas as consultas parecem complicadas por estarem na ordem inversa, usando nomes de funções agregadas:
Salário máximo N:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
para Ex: 3 salários máximos:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Salário mínimo N:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
por Ex: 3 salários mínimos:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Muito simples se você usar a sub-consulta!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
Você pode aqui apenas alterar o enésimo valor após a restrição LIMIT.
Aqui nesta Subconsulta Selecione EmpSalary em Employee Order by EmpSalary DESC Limit 3; retornaria os 3 principais salários dos Funcionários. Do resultado, escolheremos o salário mínimo usando o comando MIN para obter o 3º salário superior do funcionário.
Substitua N pelo seu número máximo
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Explicação
A consulta acima pode ser bastante confusa se você não viu nada parecido antes - a consulta interna é chamada de subconsulta correlacionada porque a consulta interna (a subconsulta) usa um valor da consulta externa (neste caso, a tabela Emp1 ) em sua cláusula WHERE.
E fonte
... WHERE (N-1) = (Subquery)...
funciona. A subconsulta é uma consulta correlacionada, pois sua WHERE
cláusula usa Emp1
da consulta principal. A subconsulta é avaliada cada vez que a consulta principal varre uma linha. Exemplo, se formos encontrar o 3º maior salário (N = 3) de (800, 1000, 700, 750), a subconsulta para a 1ª linha seria SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0. Para o 4º salário, o valor (750) ... WHERE Emp2.Salary > 750
será 2, ou N -1, portanto, esta linha será retornada.
Terceiro ou enésimo salário máximo da tabela de salários sem usar subconsulta
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
Para o 3º maior salário, coloque 2 no lugar de N-1
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Consulte a consulta a seguir para obter o enésimo salário mais alto. Desta forma, você obtém o enésimo maior salário em MYSQL. Se você deseja obter o n-ésimo salário mais baixo, apenas substitua DESC por ASC na consulta.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Método 1:
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Método 2:
Select EmpName,salary from
(
select EmpName,salary ,Row_Number() over(order by salary desc) as rowid
from EmpTbl)
as a where rowid=3
Em 2008 podemos usar ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) para obter uma classificação sem empates que possamos usar.
Por exemplo, podemos obter o 8º maior desta forma, ou alterar @N para outra coisa ou usá-lo como um parâmetro em uma função, se desejar.
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;
No SQL Server 2012, como você deve saber, isso é executado de forma mais intuitiva usando LAG ().
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
Esta é uma das perguntas populares em qualquer entrevista SQL. Vou escrever consultas diferentes para descobrir o enésimo maior valor de uma coluna.
Eu criei uma tabela chamada “Emloyee” executando o script abaixo.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
Agora vou inserir 8 linhas nesta tabela executando a instrução insert abaixo.
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)
Agora descobriremos o terceiro Basic_sal mais alto da tabela acima usando diferentes consultas. Eu executei a consulta abaixo no Management Studio e abaixo está o resultado.
select * from Employee order by Basic_Sal desc
Podemos ver na imagem acima que o 3º maior Salário Básico seria 8500. Estou escrevendo 3 maneiras diferentes de fazer o mesmo. Ao executar todas as três consultas mencionadas abaixo, obteremos o mesmo resultado, ou seja, 8500.
Primeira maneira: - Usando a função de número de linha
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;
Estou apresentando o 3º maior salário
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
Forma otimizada: Em vez de subconsulta, use apenas limite.
select distinct salary from employee order by salary desc limit nth, 1;
Consulte a sintaxe de limite aqui http://www.mysqltutorial.org/mysql-limit.aspx
Para obter o terceiro maior valor da tabela
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Por subconsulta:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Tente esta consulta
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
Coloque n = qual valor você deseja
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Experimente este código: -
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);
Substitua n pelo enésimo maior salário como número.
Tente este...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
SELECT * FROM (selecionar Salário distinto de Clientes ordem por salário DESC) limite 4,1;
O limite 4,1 significa deixar as primeiras 4 linhas e, em seguida, selecionar a próxima.
O limite e o número de linhas dependem da plataforma que você está usando.
Experimente, vai funcionar.
NOTA: Substitua o OFFSET 3 na consulta por QUALQUER enésimo número inteiro
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
Descrição
BUSQUE A PRÓXIMA 1 LINHA SOMENTE
retornar apenas 1 linha
DESLOCAR 3 LINHAS
excluir os primeiros 3 registros Aqui você pode qualquer número inteiro
As subconsultas sempre levam mais tempo:
use a consulta abaixo para obter os dados mais altos e mais baixos:
Dados mais altos: select *from business order by id desc limit 3,1;
Dados mais baixos: select *from business order by id asc limit 3,1;
Pode usar N no lugar de 3 para obter os enésimos dados.