【问题标题】:alternate of intersect set operator in oracleoracle中相交集运算符的替代
【发布时间】:2021-11-13 18:23:00
【问题描述】:

我有一个表 emp1,其中我只对工资低于 2000 且现在工资高于 2000 的员工感兴趣。这是只有一个人病房的情况,如下所示。我用 intersect 准备了答案,但想知道是否有更有效的方法。请让我知道这对我有很大帮助

(选择 empno,deptno 来自emp1 其中sal2000 按 empno,hiredate,deptno 分组 )

谢谢

【问题讨论】:

  • 先把问题搞清楚。在您的代码中,您会找到最低工资为或小于 2000 且最高工资为或大于 2000 的员工。这与“加入”工资 2000 不同,除非 你假设(这是一个强有力的假设,你应该说明,如果你做出这样的假设)工资总是随着时间的推移而上升,而不是下降。所以 - 请澄清一下。
  • 谢谢 mathguy 让我这么说我想要工资低于 2000 并且现在工资高于 2500 的人。因为在我的 emp 表中只有一个人满足这个条件,所以我希望员工人数为 1。如果有意义,请告诉我,其他人的薪水也超过 2500,但他们已经加入了该薪水,所以我不考虑他们。
  • 好的,所以您当前的查询不会这样做 - 它只查找“最低”和“最高”工资,而不是“最早”和“最近”。

标签: oracle set operators intersect


【解决方案1】:

首先,您可以通过以下方式获得满足您条件的特定员工(在评论中进行了修改):最早薪水 2500。请注意,在我的示例数据中,员工 1008 从 1300 开始并且在某个时候的薪水 > 2500,但他的当前薪水是

查询尽可能高效:它执行标准聚合,仅此而已。条件在having 子句中。 first/last 聚合函数,尽管它非常有用,但被绝大多数程序员忽略了——没有好的理由。

with
  sal_hist (empno, sal_date, sal) as (
    select 1003, date '2000-01-01', 2300 from dual union all
    select 1003, date '2008-01-01', 2600 from dual union all
    select 1008, date '2002-03-20', 1300 from dual union all
    select 1008, date '2005-01-31', 2600 from dual union all
    select 1008, date '2013-11-01', 2400 from dual union all
    select 2025, date '2008-03-01', 1900 from dual union all
    select 2025, date '2015-04-01', 2550 from dual
  )
select empno
from   sal_hist
group  by empno
having min(sal) keep (dense_rank first order by sal_date) < 2000
   and min(sal) keep (dense_rank last  order by sal_date) > 2500
;

     EMPNO
----------
      2025

要获取此类员工的数量,请将上述查询包装在外部查询中,使用select count(*) as my_count from ( &lt;above query&gt; )

为了获得额外的功劳,请尝试了解为什么以下查询也有效。它更紧凑(并且可能更快,即使不是很多),但有点难以理解 - 尤其是理解为什么我需要 min(empno) 而不是在 count() 调用中简单地使用 empno*

select count(min(empno)) as my_count
from   sal_hist
group  by empno
having min(sal) keep (dense_rank first order by sal_date) < 2000
   and min(sal) keep (dense_rank last  order by sal_date) > 2500
;

【讨论】:

  • 非常感谢您的帮助 mathguy 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多