报告 HR 模式中的工作差异

Report Job difference in HR schema

我是 Oracle 的新手,正在尝试使用 HR 模式进行练习。例如我想报告那些工作与以前的工作不同的人。

employees table 中的员工姓名和 job_history table 中的工作经历。

我认为以下查询会有所帮助。 (我正在考虑当前 JOB_ID 出现在 EMPLOYEES table 中,并且您想将其与 JOB_HISTORY table 中的最新 JOB_ID 进行比较] 为员工)

SELECT E.*, JH.LATEST_PREV_JOB_ID 
FROM EMPLOYEES E 
JOIN (SELECT FIRST_VALUE(JH.JOB_ID) OVER (PARTITION BY JH.EMPLOYEE_ID 
                           ORDER BY JH.START_DATE DESC NULLS LAST) AS LATEST_PREV_JOB_ID, 
             JH.EMPLOYEE_ID 
        FROM JOB_HISTORY JH) JH
ON E.EMPLOYEE_ID = JH.EMPLOYEE_ID
WHERE E.JOB_ID <> JH.LATEST_PREV_JOB_ID

-----更新

你想要没有partition by子句的查询(即没有WINDOWS函数),我们可以使用NOT EXISTS如下:

SELECT E.*, JH.LATEST_PREV_JOB_ID 
FROM EMPLOYEES E 
JOIN (SELECT JH.JOB_ID AS LATEST_PREV_JOB_ID, 
             JH.EMPLOYEE_ID 
        FROM JOB_HISTORY JH
        WHERE NOT EXISTS (SELECT 1 FROM JOB_HISTORY JHIN 
                                  WHERE JHIN.EMPLOYEE_ID = JH.EMPLOYEE_ID 
                                    AND JHIN.START_DATE > JH.START_DATE)) JH
ON E.EMPLOYEE_ID = JH.EMPLOYEE_ID
WHERE E.JOB_ID <> JH.LATEST_PREV_JOB_ID

如果我理解正确你的问题,那么答案可能是这样的:

select
    e.first_name,
    e.last_name,
    e.job_id as prev_job,
    jh.job_id as last_lob
from
    employees e,
    job_history jh,
    (select
        employee_id,
        max(end_date) as max_end_date
    from
        job_history          
    group by
        employee_id
    ) t    
where
    (jh.employee_id = e.employee_id) and
    (jh.job_id <> e.job_id) and
    (jh.end_date = t.max_end_date) and
    (t.employee_id = jh.employee_id)