查找前几个或最多观察值时使用 TOP 或 Rank
Posted
技术标签:
【中文标题】查找前几个或最多观察值时使用 TOP 或 Rank【英文标题】:Use TOP or Rank when finding the first few or the most observations 【发布时间】:2019-07-13 17:13:50 【问题描述】:我搜索了其他人的代码并尝试在我的情况下进行自定义, 但似乎当问题是“最大值”时,它起作用了。 在寻找前 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
【问题讨论】:
How do I do top 1 in Oracle?的可能重复 我查过了。我将代码更改为从 Etable_employee WHERE rownum=100 中选择 * over (rank() order byhir_date DESC),但它不起作用。 【参考方案1】:让公司的前 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()
函数的表达式中删除,并且雇用日期的顺序不应该是降序而是升序。
Demo for Top 10 Employee
【讨论】:
谢谢!我确实使用 fetch 成功,但使用 rownum 失败了。非常感谢!请问这里为什么不能使用分区?因为是hire_date?谢谢!! 不客气@Chen。partition
就像 group by
,对于每一步,您都以循环方式返回到第一个值 (1),除非hire_dates 连续相等。顺便说一句,您甚至可以在 order by 子句中使用分析函数,例如 dense_rank() over ( order by hire_date )
,但是对于 12 版来说,在没有子查询的情况下限制到某个值仍然是问题-以上是关于查找前几个或最多观察值时使用 TOP 或 Rank的主要内容,如果未能解决你的问题,请参考以下文章
sql - 当我得到 2 个或更多具有相同值的值时,仅更新 1 个(查询找到的第一个)值的方法?