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