2

我有一个员工表,其中包含 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 子句中,我不仅会获得最新记录,还会获得其他记录。

4

6 回答 6

10
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” - 如果同一日期还有“离开者”,则将处理“加入者”状态。)

 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;
于 2012-05-28T15:10:32.607 回答
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
于 2012-05-28T14:24:51.443 回答
1

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

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

两行的有效日期相等,它可能会返回 id 为 2 而不是 3 的记录。

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

于 2012-05-28T14:39:17.850 回答
1

尝试:

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
于 2012-05-28T14:22:26.407 回答
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
于 2013-03-13T03:56:39.093 回答
0

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

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

select * 
from EMPLOYEE 
where effective_date in (
    SELECT MAX(effective_date) AS latest_effective_date 
    FROM EMPLOYEE GROUP BY emp_id
);
于 2021-06-18T07:46:43.813 回答