Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORACLE:如何选择以前的不同值?_Oracle - Fatal编程技术网

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

ORACLE:如何选择以前的不同值?,oracle,Oracle,我有一个存储员工职务名称的表,它有以下列: 身份证件日期(由);;日期(至);emp_id;作业名称(id),;等级 由于许多等级变化,每个emp_id可以有许多具有相同jobname_id的连续记录。 如何选择上一个不同的jobname\u id,而忽略与当前相同的jobname\u id?这是否适用于您的问题: SELECT DISTINCT e1.emp_id, e1.jobname_id FROM employee e1 WHERE NOT EXIST

我有一个存储员工职务名称的表,它有以下列: 身份证件日期(由);;日期(至);emp_id;作业名称(id),;等级

由于许多等级变化,每个emp_id可以有许多具有相同jobname_id的连续记录。
如何选择上一个不同的jobname\u id,而忽略与当前相同的jobname\u id?

这是否适用于您的问题:

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的观点,从根本上说,这是一个设计问题,也许应该解决这个问题,而不是解决这个问题。

这个解决方案使用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 
/

我们可以假设日期决定哪一项是最近的工作吗?(即使是在将来)。或者你需要对范围(从到)进行一些计算来决定这一点吗?另外,如果只有一个jobname\u id没有以前的名称,是否要将其选中?或者你不想选择吗?据我所知,最近的工作是目前的工作,我不考虑那些有未来日期的工作。完美的情况是,如果当前jobname_id是唯一一条记录,则应返回“null”值。我还应该考虑那些离开公司的员工,他们的最新jobname\u id在过去是date\u to,在这种情况下,这将是以前的jobname\u id,因为在date\u from和sysdate之间没有jobname\u id。。。