Database
 sql >> Base de Dados >  >> RDS >> Database

Enésimo salário mais alto


A pergunta mais comum e importante feita em entrevistas é como podemos encontrar o enésimo salário mais alto em uma tabela (2 salários mais altos, 3 salários mais altos ou enésimo salário mais alto), onde N poderia ser 2, 3, 4, 5 ou qualquer coisa.

Cada programador sabe que a maneira mais fácil de encontrar o n salário mais alto é usando SQL (Structured Query Language) em uma tabela.

Sempre que o entrevistador lhe fizer uma pergunta sobre o 2º salário mais alto, 4º salário mais alto, e assim por diante, para resolver essa questão, devemos saber sobre alguns conceitos importantes como uma subconsulta, função a ser usada como row_num(), Rank Rank() , etc

Este artigo mostrará diferentes maneiras de encontrar o N maior salário.

Considere as tabelas existentes que possuem os seguintes registros:

Tabela:Funcionários

EMPLOYEEID FIRST_NAME LAST_NAME SALÁRIO CIDADE DEPARTAMENTO GERENTE
1001 VAIBHAVI MISHRA 65500 PUNE ORACLE 1
1002 VAIBHAV SHARMA 60.000 NOIDA C# 5
1003 NIQUIL VANI 50500 JAIPUR FMW 2
2001 PRAQUI SHARMA 55500 CHANDIGARH ORACLE 1
2002 BHAVESH JAIN 65500 PUNE FMW 2
2003 RUCHIKA JAIN 50.000 MUMBAI C# 5
3001 PRANOTI SHENDE 55500 PUNE JAVA 3
3002 ANUJA QUERER 50500 JAIPUR FMW 2
3003 DEEPAM JAUHARI 58500 MUMBAI JAVA 3
4001 RAJESH GOUD 60500 MUMBAI TESTE 4
4002 ASHWINI BOLSA 54500 NOIDA JAVA 3
4003 RUCHIKA AGARWAL 60.000 DÉLHI ORACLE 1
5001 ARQUIVO SHARMA 55500 DÉLHI TESTE 4

N salário mais alto usando uma subconsulta correlacionada


Uma subconsulta correlacionada é um tipo especial de subconsulta, em que a subconsulta depende da consulta principal e é executada para cada linha retornada pela consulta principal.

Sintaxe:
SELECT salary from employees e1WHERE N-1 = (SELECT COUNT (DISINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Onde N pode ser substituído pelos números 23 ou 4.

Exemplo 1: Escreva uma consulta para encontrar o 4 salário mais alto:
SELECT employeeid, salary from employees e1WHERE 3 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Onde N =4, N -1:4 -1 =3.

4 maior salário da tabela

Saída:
Empregado Salário
3003 58500

Explicação:

A palavra-chave distinct está lá para lidar com os salários duplicados na tabela. Para buscar o N salário mais alto, consideramos apenas os salários não duplicados. O salário mais alto significa que nenhum salário é maior do que ele. O segundo salário mais alto significa que apenas um salário é maior do que ele. O terceiro salário mais alto significa que apenas dois salários são maiores que o terceiro salário, da mesma forma, o Nº salário mais alto significa que N-1 salários são maiores que ele.

O quarto salário mais alto é 58500 do ID do funcionário 3003.

Exemplo 2:escreva uma consulta para encontrar os 3 salários mais altos:
SELECT employeeid, salary from employees e1WHERE 3 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Onde N =3, N -1:3 -1 =2.

2 salário mais alto da tabela

Saída:
Empregado Salário
1002 60.000
4003 60.000

O segundo salário mais alto é 58500 de dois ID de funcionário 1002 e ID de funcionário 4003.

Exemplo 3:escreva uma consulta para encontrar os 5 salários mais altos:
SELECT employeeid, salary from employees e1WHERE 6 - 1 = (SELECT COUNT (DISTINCT salary) FROM employees e2 WHERE e2.salary > e1.salary)

Onde N =6, N -1:6 -1 =5.

5 maior salário da tabela

Saída:
Empregado Salário
4002 54500

O quinto salário mais alto é 54500 do ID do funcionário 4002.

N salário mais alto usando LIMIT palavra-chave

Sintaxe:
SELECT salary FROM employees ORDER BY salary desc LIMIT N-1, 1;

Exemplo 1: Escreva uma consulta para encontrar 2 salários mais altos.
SELECT employeeid, salary FROM employees ORDER BY salary desc LIMIT 1, 1;

Saída:
Empregado Salário
2002 65500

Limite 1, 1 na consulta diz quanto o salário mais alto deve ser exibido.

Se você escrever 1, 2 saídas serão assim
Empregado Salário
2002 65500
4001 60500

N Salário mais alto usando a palavra-chave TOP


O cenário é calcular o N salário mais alto do funcionário da tabela de funcionários. As etapas são as seguintes:

1. O primeiro passo é pesquisar o salário exclusivo TOP dos funcionários na tabela.
2. A próxima etapa é calcular o salário mínimo entre todos os salários resultantes da primeira etapa. Por esta etapa, obtemos N salário mais alto.
3. A partir do resultado das etapas acima, identifique os detalhes do funcionário cujo salário é o salário mínimo.

Exemplo 1:
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

A instrução SQL acima é usada para encontrar os detalhes dos funcionários com o salário N mais alto.

Vamos ver a explicação da instrução SQL acima em breve:

Considere N =4.

Sempre que qualquer consulta SQL incluir uma subconsulta, lembre-se de que a consulta interna será executada primeiro, depois a consulta externa será executada.

O resultado a seguir será gerado pela consulta "SELECT DISTINCT TOP N salário dos funcionários ORDER BY salário DESC", que gerará o seguinte resultado.
Salário
65500
60500
60.000
58500

A próxima consulta externa é:"SELECT MIN(salary) FROM employees WHERE Salary IN (a saída de uma consulta SQL anterior.
Salário
58500

A partir do resultado acima, verifica-se que o quarto salário mais alto exigido é de 58.500.

Por fim, a consulta principal é SELECT * FROM employees WHERE salário =saída da consulta SQL anterior. A saída dessa consulta será o resultado dos funcionários com o quarto salário mais alto.
FIRST_NAME SALÁRIO
DEEPAM 58500

Exemplo 2:
SELECT * FROM employees WHERE salary = (SELECT MIN(salary) FROM employees WHERE salary IN(SELECT DISTINCT TOP N salary from employees ORDER BY salary DESC ));

A instrução SQL acima é usada para localizar os detalhes dos funcionários com o N salário mais alto.

Vamos ver a explicação da instrução SQL acima em breve:

Considere N =5.

Sempre que qualquer consulta SQL incluir uma subconsulta, lembre-se de que a consulta interna será executada primeiro, depois a consulta externa será executada.

O resultado a seguir será gerado pela consulta "SELECT DISTINCT TOP N salário dos funcionários ORDER BY salário DESC", que gerará o seguinte resultado.
Salário
65500
60500
60.000
58500
55500

A próxima consulta externa é:"SELECT MIN(salary) FROM employees WHERE Salary IN (a saída de uma consulta SQL anterior.
Salário
55500

A partir do resultado acima, verifica-se que o quinto salário mais alto exigido é de 55.500.

Por fim, a consulta principal é SELECT * FROM employees WHERE salário =saída da consulta SQL anterior. A saída dessa consulta será o resultado dos funcionários com o quinto maior salário.
FIRST_NAME SALÁRIO
PRAQUI 55500

Nº salário mais alto usando a função Row_Num()


Exemplo:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;
  • Para calcular o terceiro salário mais alto, use rownum <4
  • Para calcular o segundo salário mais alto, use rownum <3

Saída:
MIN(salário
60500

Vamos ver como a consulta funciona:

Etapa 1: A consulta inclui subconsulta significa consulta interna e consulta externa. Todos nós sabemos quando a subconsulta é usada na consulta, a consulta interna é executada primeiro

Primeiro, a consulta interna será executada e as consultas externas serão executadas com base na saída produzida pela consulta interna:

Consulta interna:
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

Saída da consulta interna:
Salário
65500
60500
60.000
58500
55500
54500
50500
50.000

Como usamos uma palavra-chave distinta na consulta, o salário duplicado será eliminado. O salário único será exibido como resultado da consulta interna.

Etapa 2: À medida que o servidor termina com uma consulta interna, estamos executando a consulta externa da consulta aninhada na saída que obtivemos da consulta interna
SELECT MIN(salary) FROM(SELECT DISTINCT salary FROM employees ORDER  BY salary DESC) WHERE rownum < 3;

SELECT MIN(salary) FROM (saída da consulta interna):selecione o salário mínimo da saída da consulta interna, que é 50.000 e 50.000 não é o segundo salário mais alto, por isso usamos rownum <3, que fornecerá o número de linhas do topo que é menor que 3 significa apenas 2.

A saída de WHERE rownum <3:
Salário
65500
60500

Etapa 3: A última parte da consulta, que é o SELECT MIN(salary) from (a saída de WHERE rownum<3):

A saída final da consulta:
Salário
60500

60500 é o segundo maior salário na tabela dos funcionários.

Nº salário mais alto usando a função Rank Rank ()


Exemplo:
SELECT * FROM(SELECT First_Name, salary, dense_rank()      OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank =&num;

- Para calcular o terceiro salário mais alto, use num =3

- Para calcular o segundo salário mais alto, use num =2

Vamos para num =2.

A saída final:
First_Name Salário Classificação
Rajesh 60500 2

O saída da consulta interna:
SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) Rank FROM employees

A função Dense_rank() calcula a Classificação de cada linha em um grupo de linhas de ordem em ordem crescente e retorna a Classificação como um número. O Rank começa em 1 e assim por diante.

No caso de duas ou mais de duas linhas terem o mesmo salário, atribui-se uma classificação igual a todas as linhas.

Saída da consulta interna:
Nome_nome Salário Classificação
VAIBHAVI 65500 1
BHAVESH 65500 1
RAJESH 60500 2
VAIBHAV 60.000 3
RUCHIKA 60.000 3
DEEPAM 58500 4
PRAQUI 55500 5
PRANOTI 55500 5
ARQUIVO 55500 5
ASHWINI 54500 6
NIQUIL 50500 7
ANUJA 50500 7
RUCHIKA 50.000 8

Na saída, podemos ver a mesma classificação para duplicar o salário.

Etapa 2: À medida que o servidor termina com uma consulta interna, estamos executando a consulta externa da consulta aninhada na saída que obtivemos da consulta interna
SELECT * FROM(SELECT(First_Name, Salary, dense_rank() OVER(ORDER BY salary DESC) rank FROM employees) WHERE rank = &num;

Select * from selecionará todas as linhas que não são o segundo maior salário porque usamos RankRank onde num =2 fornecerá linhas correspondentes de acordo com o valor inserido pelo usuário para num.

Como usamos num =2, a saída será
Nome_nome Salário Classificação
RAJESH 60500 2
  • Para encontrar o terceiro conjunto de salários num =3,
  • Para encontrar o quarto conjunto de salários num =4 e assim por diante.