Como encontrar o terceiro ou enésimo salário máximo na tabela de vencimentos?

Respostas:

82

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
Tim Schmelter
fonte
como obter o registro do salário mínimo da mesa? selecione ins.KYS_ID, ins.FKYS_INS_ID de cmn_pat_x_insurance ins onde ins.FKYS_PAT_ID = '1253_717' e ins.FKYS_INS_TYPE em (1) e ins.BOL_TYPE em (1,3) e ins.salário em (min (ins.salário))
saidesh kilaru
Imagine, existem 10.0000 registros na tabela de funcionários. Se eu usar a consulta acima, o desempenho será reduzido de 6 a 10 vezes.
Bimal Das
1
@BimalDas: então você não tem um índice na EmpSalarycoluna. Além disso, reduzido em comparação com o quê? A vantagem da ROW_NUMBERabordagem é 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.
Tim Schmelter
@TimSchmelter WITH CTE criará uma tabela temporária para armazenar dados inteiros da primeira instrução SELECT nela, a partir do resultado, selecionamos "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow". É por isso que acho que é um pouco lento. Eu verifiquei. e também tenho uma indexação adequada.
Bimal Das
2
@BimalDas: Não, não está criando uma tabela temporária. A cte normalmente não se materializa em lugar nenhum. É mais como uma visão embutida ou subconsulta nomeada.
Tim Schmelter
88

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
Kumar Manish
fonte
como obter o registro do salário mínimo da mesa? selecione ins.KYS_ID, ins.FKYS_INS_ID de cmn_pat_x_insurance ins, onde ins.FKYS_PAT_ID = '1253_717' e ins.FKYS_INS_TYPE em (1) e ins.BOL_TYPE em (1,3) e ins.salário em (min (ins.salário))
saidesh kilaru
Kumar e Alexander, quero mais um campo com isso, como fazer isso? minha consulta é como "" "Selecione Top 1 NoteID de (Selecione DateDiff (Year, SchedualDate, Current_TimeStamp) como NoteAge, Distinct Top 3 NoteID de [dbo]. [DocSecheduale] Ordenar por NoteID Desc) um pedido por NoteID" ""
Zaveed Abbasi
Estou achando o enésimo salário mais alto, mas estou ficando complexo para entender a subconsulta, gostaria de explicar a subconsulta ...
Deepak Gupta
@deepak_java a subconsulta é avaliada toda vez que uma linha é processada pela consulta externa. Em outras palavras, a consulta interna não pode ser processada independentemente da consulta externa, pois a consulta interna também usa o valor Emp1.
Kumar Manish
É importante entender por que ... WHERE (N-1) = (Subquery)...funciona. A subconsulta é uma consulta correlacionada, pois sua WHEREcláusula usa Emp1da 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 > 8000. Para o 4º salário, o valor (750) ... WHERE Emp2.Salary > 750será 2, ou N -1, portanto, esta linha será retornada.
jerrymouse
65

Tente isto

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

Por 3 você pode substituir qualquer valor ...

Codesen
fonte
isso funciona com oracle 10g ou 11g? Ou existe uma alternativa que seja bonita assim?
RBz
40

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)
Rajesh Pathakoti
fonte
Mais simples e fácil de lembrar. +1
Sнаđошƒаӽ
4
para obter o salário máximo por que estamos fazendo na ordem ASC, isso tem que ser feito na ordem DESC, se tivermos um salário como este 7000,10000,11000,500,800,900,12000, a consulta interna de classificação resultará no top3, que significa 500,800,900 e o máximo deles é 900, mas 900 não é o máximo de 3, o salário máximo de 3 é 10000.
Narendra Jaggi
1
para Ex: 3 salários máximos: Tem que ser assim SELECT Min (EmpSalary) FROM Salary ONDE EmpSalary IN (SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Jimit Rupani
15

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.

anonxss
fonte
Obtendo este erro. Código de erro: 1248 Cada tabela derivada deve ter seu próprio alias
adicione um alias a ele .. SELECT MIN (EmpSalary) from (SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3) como s;
anonxss
Basta usar DISTINCT para evitar duplicatas SELECT MIN (EmpSalary) from (SELECT DISTINCT (EmpSalary) from Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh
14

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

Amor
fonte
+1 É importante entender por que ... WHERE (N-1) = (Subquery)...funciona. A subconsulta é uma consulta correlacionada, pois sua WHEREcláusula usa Emp1da 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 > 8000. Para o 4º salário, o valor (750) ... WHERE Emp2.Salary > 750será 2, ou N -1, portanto, esta linha será retornada.
jerrymouse
13

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

Darvi Sunny
fonte
3
É importante mencionar que OFFSET FETCH está disponível na versão 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
Pankaj Gaikwad
fonte
1
Obrigado por DENSE_RANK () eu nunca ouvi falar dele
Vivekh
8

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. enésimo maior salário

Vijay Bhatt
fonte
1
A questão é sobre o SQL-Server, não sobre o MySQL.
bummi
8
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Saurabh Chandra Patel
fonte
6

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

fonte
O método 1 pode ser classificado: SELECIONE O MAIOR 1 SALÁRIO DE (SELECIONE O MAIOR 3 SALÁRIO DOS FUNCIONÁRIOS) * motivo - porque por padrão é a ordem crescente
Ashish Agrawal Yodlee
5

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

David Söderlund
fonte
4
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal
Uma Shankar Lakhera
fonte
Potencialmente alterar a impressão para selecionar
Tomas Pastircak
3

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
Neeraj Kumar Yadav
fonte
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;

Estou apresentando o 3º maior salário

Kiran lanke
fonte
3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'
Vikas Joshi
fonte
3

--nº maior salário

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

- (n-1) maior salário

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )
Surya-AIS
fonte
3

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

Kishor Vitekar
fonte
sim! é uma solução muito simples e limpa.
Avnish alok 02 de
3

Para obter o terceiro maior valor da tabela

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
jitendra rajput
fonte
SELECT Distinct columnName FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Devendra Singraul
2

Por subconsulta:

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

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

Mayur Sawant
fonte
1
set @n = $n

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

Solução testada MySQL, suponha que N = 4:

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

Outro exemplo:

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

Experimente este código: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )
Deepak Kumar
fonte
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);

Substitua n pelo enésimo maior salário como número.

Ajay Singh Meena
fonte
0

Tente este...

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

Para o 2º maior salário, altere 3 para 2 na consulta acima e para o Nº maior salário para N onde N = 1,2,3,4 ....

aprendiz
fonte
0

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.

Saif Grover
fonte
0

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

Hardik Masalawala
fonte
0

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.

Ankit Gupta
fonte