当前位置: 首页 > 面试题库 >

Oracle Analytic函数可实现分组中的最小值

水浩歌
2023-03-14
问题内容

我是分析功能的新手。

部门雇员薪金
---- ----- ------
  100000年10月10日
  10约翰200000
  10斯科特300000
  20鲍勃100000
  20下注200000
  30 ALAN 100000
  30汤姆200000
  30吉夫300000

我要最低工资的部门和雇员。

结果应如下所示:

部门雇员薪金
---- ----- ------
  100000年10月10日
  20鲍勃100000
  30 ALAN 100000

编辑:这是我有的SQL(但当然,它不起作用,因为它也希望group by子句中的人员):

SELECT部门, 
  emp
  最低工资(保持工资)(DENSE_RANK工资第一阶)
来自mytable
按部门分组

问题答案:

我认为Rank()函数不是解决这个问题的方法,这有两个原因。

首先,它可能不如基于Min()的方法有效。

原因是查询在扫描数据时必须维护每个部门所有薪水的有序列表,然后稍后将通过重新读取此列表来分配等级。显然,在没有可用于此目的的索引的情况下,在读取完最后一个数据项之前,您无法分配等级,并且维护列表的成本很高。

因此,Rank()函数的性能取决于要扫描的元素总数,如果数量足以使排序溢出到磁盘,则性能将下降。

这可能更有效:

select dept,
       emp,
       salary
from
       (
       SELECT dept, 
              emp,
              salary,
              Min(salary) Over (Partition By dept) min_salary
       FROM   mytable
       )
where salary = min_salary
/

此方法仅要求查询在每个部门中维护到目前为止所遇到的最小值的单个值。如果遇到新的最小值,则将修改现有值,否则将丢弃新值。必须保留在内存中的元素总数与部门数有关,而不与扫描的行数有关。

可能是甲骨文拥有一条代码路径来识别在这种情况下并不需要真正计算排名,但是我不会打赌。

不喜欢Rank()的第二个原因是它只是回答了错误的问题。问题不是“哪个记录的薪水是每个部门的薪水递增时的第一位”,而是“哪个记录的薪水是每个部门的最低薪水”。至少对我来说,那有很大的不同。



 类似资料:
  • 本文向大家介绍返回JavaScript中数组的最小值和最大值的函数,包括了返回JavaScript中数组的最小值和最大值的函数的使用技巧和注意事项,需要的朋友参考一下 问题 我们需要编写一个接受一个数组并返回另一个数组的JavaScript函数,该数组的第一个元素应该是输入数组的最小元素,第二个应该是输入数组的最大元素。 示例 以下是代码- 输出结果

  • 我正在尝试优化一个函数,给定一个N int数组,它返回一个元素和前一个元素之间的最小差异。显然,该函数仅适用于具有维度的数组 不知道有没有办法避免在main中传递第一个差,而是在递归函数中做所有的事情。我可以用stdio . h/stdlib . h/string . h/math . h作为头文件。非常感谢你的帮助,我希望这能让我对递归函数有更好的理解。

  • 我正在尝试以下练习来提高我的在线技能,我遇到了以下问题。 这是一个演示任务。 编写一个函数:class Solution{public int Solutions(int[]A);},给定一个包含N个整数的数组A,返回A中没有出现的最小正整数(大于0)。 举个例子, 给定 A = [1, 3, 6, 4, 1, 2],函数应返回 5。给定 A = [1, 2, 3],函数应返回 4。给定 A =

  • 问题内容: 我来自C ++背景,并且习惯于使用此类的东西。假设我想要这些的动态数组: 这样做的标准方法是什么? 摘要非常有用 问题答案: 使用内置 例: 有关附加的更多信息,请参考规范。

  • 本文向大家介绍postgresql 实现取出分组中最大的几条数据,包括了postgresql 实现取出分组中最大的几条数据的使用技巧和注意事项,需要的朋友参考一下 看代码吧~ 其中 执行结果: 添加行序号:ROW_NUMBER () OVER (ORDER BY A.bsm ASC) AS 序号 分组添加序号:ROW_NUMBER () OVER (PARTITION BY xzqdm ORDER

  • 通常,列表可以实现为链表(遍历速度较慢),也可以实现为数组列表(插入元素时速度较慢)。 我想知道是否有可能使用处理器的MMU来更有效地实现列表,只要插入或删除一个元素,就可以重新映射而不是复制内存。这意味着数组中任何地方的索引和插入/删除速度都要达到O(1),比任何其他列表实现都要好。 我的问题是: 程序是否真的能够控制自己的虚拟内存,或者是否需要对操作系统进行更改 每个进程的页表条目数是否有限制