如何获取oracle中的最新员工记录?

时间:2012-05-28 14:14:18

标签: sql oracle

我有一个employee表,其中包含emp_id,firstname,lastname,region_id,status和effective_date等列。

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

员工可以有两种状态'Leaver'和'Joiner'。

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子句中,我不会只获得最新的记录,但其他记录也是如此。

6 个答案:

答案 0 :(得分:9)

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的记录。

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

(“状态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;

答案 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

答案 2 :(得分:1)

您输入的查询不一定会像之前所说的那样使用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的记录。

尝试为您的表添加时间或为您的effective_date列添加时间,这样您就可以在确定的日期获得用户的最新结果。

答案 3 :(得分:1)

试试这个

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

答案 4 :(得分:0)

尝试:

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

答案 5 :(得分:0)

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

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

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