在查找前几个或最多的观测值时使用 TOP 或 Rank



我已经搜索了其他人的代码并尝试在我的情况下进行自定义,但似乎当问题是"最大"时,它奏效了。当谈到找到前 100 名时,它不起作用。我正在努力让公司雇用前100名员工。我首先尝试了 TOP(100(,然后尝试了 RANK((,我想它们都可以工作。不过,我对语法不是很熟悉。我想知道有人可以就我的代码提供任何建议吗?

谢谢!

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
where hire_date = (select DENSE_RANK() OVER (PARTITION BY e.hire_date ORDER BY hire_date DESC) AS E_RANK_hire  WHERE rownum=100))
Group BY E_RANK_hire
order by E_RANK_hire

让公司雇用前 100 名员工

首先,请注意平局案例包含在下面两个查询的结果中。 例如,即使您的员工具有相同的雇用日期,他们也包含在列表中,这意味着列表至少有 100 人。

如果您的数据库版本是 12c- ,那么您需要使用一个子查询来返回dense_rank()函数的结果:

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;

如果你的数据库版本是12c+,那么你不需要使用子查询fetch子句:

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;

请注意,使用partition by子句是错误的,应在dense_rank()函数的表达式中删除,并且雇用日期的顺序不应是降序而是升序。

前 10 名员工演示

相关内容

  • 没有找到相关文章

最新更新