ORACLE:如何选择以前的不同值?
我有一个存储员工职务名称的表,它有以下列: 身份证件日期(由);;日期(至);emp_id;作业名称(id),;等级 由于许多等级变化,每个emp_id可以有许多具有相同jobname_id的连续记录。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
如何选择上一个不同的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。。。