Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Use TOP ou Rank ao encontrar as primeiras ou a maioria das observações


Para conseguir as primeiras 100 pessoas contratadas na empresa

Em primeiro lugar, tenha cuidado com os casos de empate incluídos nos resultados de ambas as consultas abaixo. por exemplo. mesmo que você tenha funcionários com data de contratação igual, eles são incluídos nas listas, o que significa que as listas têm pelo menos 100 pessoas.

Se a versão do seu banco de dados for 12c- , então você precisa usar uma subconsulta para retornar o resultado de dense_rank() função:
select department_name, department_id, first_name, hire_date, salary
  from
  (
   select d.department_name, d.department_id, e.first_name, e.hire_date, e.salary,
          dense_rank() over ( order by hire_date ) as e_rank_hire
     from Dtable_department d 
     join Etable_employee e
       on e.department_id = d.department_id
  )
 where e_rank_hire <= 100 
 order by e_rank_hire;

Se a versão do seu banco de dados for 12c+ , então você não precisa usar uma subconsulta para fetch cláusula:
select d.department_name, d.department_id, e.first_name, e.hire_date, e.salary
  from Dtable_department d 
  join Etable_employee e
    on e.department_id = d.department_id
order by hire_date
fetch first 100 rows with ties;

Preste atenção para o seu caso usando partition by cláusula está errada e deve ser removida dentro do dense_rank() a expressão da função e a ordem das datas de contratação não devem ser decrescentes, mas crescentes.

Demonstração para os 10 melhores funcionários