ORACLE:如何选择以前的不同值?

时间:2011-09-19 10:14:10

标签: oracle

我有存储员工职位名称的表,它包含以下列: ID; date_from; DATE_TO; EMP_ID; jobname_id;级;

由于许多等级更改,每个emp_id可以有许多具有相同jobname_id的连续记录。 如何选择以前的不同jobname_id,省略与最新的jobname_id相同的那些?

2 个答案:

答案 0 :(得分:1)

此解决方案使用FIRST_VALUE()分析函数来识别每个员工的当前工作。然后它会过滤掉与那个不匹配的所有工作:

select distinct id
       , jobname_id
from ( select id
              , jobname_id
              , first_value(jobname_id) over (partition by id 
                                               order by from_date desc) as current_job
       from employee
       where emp_id = 1234 )
where jobname_id != current_job
order by id, jobname_id 
/

答案 1 :(得分:0)

这适合您的问题:

SELECT DISTINCT 
       e1.emp_id,
       e1.jobname_id
  FROM employee e1
 WHERE NOT EXISTS
       (SELECT 1
          FROM employee e2
         WHERE e1.emp_id = e2.emp_id
           AND SYSDATE BETWEEN e2.date_from 
                           AND NVL(e2.date_to, SYSDATE + 1));

(这假设您的表名为“employee”,emp_id是PK值。)

它选择emp_id,jobname_id值不是最新值的唯一emp_id,jobname_id值。

编辑:我同意Chin Boon的观点,从根本上说这是一个设计问题,也许应该解决这个问题而不是解决问题。