如何编写查询以获取oracle中生效日期的最新员工记录?

时间:2012-05-21 12:52:56

标签: sql oracle

我有一个employee和employee_history表。对于employee表的每次更新,我都会在employee_history表中插入一条记录。

这两个表都有一个名为生效日期的列,表示员工状态为该生效日期。

以下是我的两张桌子。

enter image description here

我需要在生效日期获得最新的员工记录。

例如,如果我需要获得16岁的员工,我可以从历史表中获取emp_hist_id = 2记录。和6月5日一样,我应该从hist表中获取emp_hist_id = 4。

截至8月15日,我应该从员工表中获取记录。

请帮忙。

3 个答案:

答案 0 :(得分:3)

您可以尝试类似

的内容
SELECT * FROM (
  SELECT * FROM (
    (SELECT emp_id, name, email, title, region, division, "effective date" 
     FROM employee
     WHERE emp_id = desired_id)
    UNION
    (SELECT emp_id, name, email, title, region, division, "effective date" 
     FROM employee _history
     WHERE emp_id = desired_id)
  ) t
  WHERE t."effective date" <= desired_date
  ORDER by t."effective date" DESC) p
WHERE ROWNUM = 1

我们的想法是从两个表中获取与所需用户相关的记录,然后将日期低于所需的日期,最后抓住第一个

答案 1 :(得分:1)

您可以在没有分析功能的情况下解决此问题。此处的子查询计算员工生效日期之前历史记录中的最新生效日期:

select e.*
from employee_history eh join
     (select e.employee_id, max(eh.effective_date) as latest_effective_date
      from employee e join
           employee_history eh
           on e.employee_id = eh.employee_id and
              e.effective_date >= eh.effective_date
     ) ehl
     on eh.employee_id = ehl.employee_id and
        eh.effective_date = ehl.effective_date

此解决方案假定历史记录表中没有重复的生效日期。如果有,那么你有另一种选择。假设employee_history_ids是按顺序分配的,请取该id的最大值而不是日期。

使用Oracle的分析功能,可以使用其他解决方案。

答案 2 :(得分:0)

尝试以下方法:

SELECT *
FROM
  (SELECT e.emp_id,
          e.name,
          e.email,
          e.title,
          e.region,
          e.division,
          e.effective_date,
          row_number() over (partition BY e.emp_id
                             ORDER BY e.effective_date DESC) rn
   FROM employee e
   UNION ALL 
   SELECT eh.emp_id,
          eh.name,
          eh.email,
          eh.title,
          eh.region,
          eh.division,
          eh.effective_date,
          row_number() over (partition BY eh.emp_id
                             ORDER BY eh.effective_date DESC) rn
   FROM employee_history eh)
WHERE effective_date < to_date('15/06/2012','DD/MM/YYYY')
  AND rn = 1

您可以看到更好的示例here