我已经搜索了其他人的代码并尝试在我的情况下进行自定义,但似乎当问题是"最大"时,它奏效了。当谈到找到前 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 名员工演示