【问题标题】:How to get the latest employee record in oracle?oracle如何获取最新的员工记录?
【发布时间】:2012-06-02 21:44:12
【问题描述】:

我有一个员工表,其中包含 emp_id、firstname、lastname、region_id、status 和 Effective_date 等列。

员工表可以为同一员工有多个具有不同生效日期和状态的条目。

员工可以有两种状态“离职者”和“入职者”。

id     emp_id    firstname     region    status     effective_date  
1       1         James        Asia      Joiner     1-Jan-2012 
2       1         James        UK        Leaver     1-Aug-2012
3       1         James        USA       Joiner     1-Aug-2012
4       1         James        Asia      Leaver     1-May-2012
5       1         James        UK        Joiner     1-May-2012
6       1         James        USA       Leaver     1-Sep-2012

根据员工表中的上述数据,如果我想获取 2012 年 1 月 1 日的最新记录,我会得到 id = 1 的记录,

如果我想获得詹姆斯在 2012 年 5 月 1 日的最新记录,我将获得 id = 5 的记录

如果我想获得詹姆斯 2012 年 8 月 1 日的最新记录,我将获得 id = 3 的记录,

如果我想获得詹姆斯 2012 年 9 月 1 日的最新记录,我将获得 id = 6 的记录

以下查询正确给了我最新记录

SELECT 
        emp_id, 
        MAX(effective_date) AS latest_effective_date
FROM 
        EMPLOYEE
GROUP BY 
        emp_id

但是我如何获取其他列,例如 firstname 、 region 等。

如果我将它们放在 select 子句或 group by 子句中,我不仅会得到最新的记录,还会得到其他记录。

【问题讨论】:

  • 你能解释一下吗? “如果我想获得詹姆斯 2012 年 8 月 1 日的最新记录,我会获得 id = 3 的记录”为什么不是 2?
  • @Sebas。当然,詹姆斯将于 2012 年 8 月 1 日从英国地区搬到美国。所以,如果我需要查看 2012 年 8 月 1 日詹姆斯在哪里,它必须返回美国而不是英国。因此 id = 3 而不是 id = 2 的记录。
  • 那么您的整个逻辑将被审查,您自己的查询只是偶然返回“正确的最后一条记录”。我现在离开这个话题,你有分析问题要解决。

标签: sql oracle


【解决方案1】:
SELECT * FROM 
( SELECT  
    e.*,
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC) r
FROM  
    EMPLOYEE  e)
WHERE r = 1;

以上将为您提供每个不同 emp_id 的最大有效__Date 记录。

此查询应满足您返回给定日期记录的第二个要求:

(“status ASC” - 如果同一日期还有“Leaver”,则将处理“Joiner”状态。)

 SELECT * FROM 
( SELECT  
    e.*,
    ROW_NUMBER() OVER (partition by emp_id order by effective_date DESC, status ASC) r
FROM  
    EMPLOYEE  e
WHERE effective_date <= '<your desired date>')
WHERE r=1;

【讨论】:

    【解决方案2】:

    您需要将已有的查询内联回 Employee 表以限制记录:

    SELECT  Emp.*
    FROM    Employee Emp
            INNER JOIN
            (   SELECT  Emp_ID, MAX(effective_date) AS latest_effective_date
                FROM    Employee
                GROUP BY Emp_ID
            ) MaxEmp
                ON Emp.Emp_ID = MaxEmp.Emp_ID
                AND Emp.Effective_Date = MaxEmp.latest_effective_date
    

    【讨论】:

    • 我无法根据此反馈提出改进/更正建议。为什么它不工作,它不运行?它是否运行但未达到您预期的结果?
    【解决方案3】:

    尝试:

    SELECT *
    FROM EMPLOYEE emp
    INNER JOIN (SELECT max(id) AS id
            emp_id, 
            MAX(effective_date) AS latest_effective_date
    FROM 
            EMPLOYEE
    GROUP BY 
            emp_id) AS employee_1 on emp.id = employee_1.id
    

    【讨论】:

    • Ids 可能不会按顺序生成。用户可以先在系统中输入 1-sep-2012 的记录,然后再插入 1-Aug-2012 的记录(即预测)。
    【解决方案4】:

    您输入的查询不一定像您之前所说的那样返回 ID 为 3、5、6 的记录,因为在这种情况下:

    2       1         James        Asia      Leaver     1-May-2012
    3       1         James        UK        Joiner     1-May-2012
    

    effective_date 对两行都相等,它可能会返回 id 为 2 而不是 3 的记录。

    尝试向您的表格添加时间或向您的有效日期列添加时间,这样您就可以在确定的日期从用户那里获得最新结果。

    【讨论】:

      【解决方案5】:

      试试这个

      SELECT  
        MAX(id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) id,
        MAX(emp_id) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) emp_id,
        MAX(firstname) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) firstname,
        MAX(status) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) status,
        MAX(effective_date) KEEP (DENSE_RANK FIRST ORDER BY effective_date DESC) effective_date
      FROM Employee GROUP BY firstname
      

      【讨论】:

        【解决方案6】:

        问题:获取公司最新加入的员工记录

        解决方案:
        步骤 1. 获取员工最近加入公司的最新日期
        第 2 步:获取在该日期加入的所有员工的记录

        select * 
        from EMPLOYEE 
        where effective_date in (
            SELECT MAX(effective_date) AS latest_effective_date 
            FROM EMPLOYEE GROUP BY emp_id
        );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-17
          • 2015-12-18
          • 2019-12-03
          • 2020-02-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多