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 =#
- 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 = #
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.