查找前几个或最多观察值时使用 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 个(查询找到的第一个)值的方法?

求助:怎样在excel表格中查找后实现自动按照查找顺序排序?

查找出现次数最多的数

根据 Int 数组过滤数组

Linux命令行查看内存

查找矩阵最小元素的 2 个或多个索引(行和列)