OracleSQL:将员工分配给具有日期值的组,按日期查询当前分配

时间:2015-12-04 10:08:40

标签: sql oracle greatest-n-per-group

我有一个由员工(一个表)组成的数据库,可以分配给组(另一个表)。麻烦与另一个表employee-to-group连接在一起,该表列出了组ID,员工ID和分配的开始日期。

员工总是必须被分配到一个组,但是分配可以每天更改。一名员工可以在A组工作一天,然后改为B组,仅在一周后在C组工作。

我的任务是找出在任何给定日期分配给某个组的员工名称。所以输入应该是:组名,日期和我希望输出是在给定时刻属于该组的所有员工的数据。

这是一个SQL小提琴,其中包含一些测试数据: http://sqlfiddle.com/#!9/6d0bb

我用mysql语句重新创建了数据库,因为我无法找出oracle语句,对不起。

从测试数据中可以看出,一些员工可能永远不会更改组,而其他员工则经常更改。这些员工也计划在未来改变任务。查询必须考虑到这一点。

因为应用程序是遗留应用程序,所以值(特别是在日期字段中)值得怀疑。它们是自1990年1月1日起的#34;以及#34; 9131"意味着" 2015年1月1日和#34; 9468将是今天(2015-12-04),9496将是2016-01-01)。

我已经拥有的代码是找出"日期值"对于任何给定的日期我称之为"遗留格式"我正在使用的应用程序(这里我刚刚使用了CURRENT_DATE):

SELECT FLOOR(CURRENT_DATE - TO_DATE('1990-01-01', 'YYYY-MM-DD')) AS diffdate

为了找出某个员工被分配到哪个组,我尝试了:

SELECT * FROM history h 
WHERE emp_nr = 1 AND valid_from <= 9131
ORDER BY valid_from DESC 
FETCH FIRST ROW ONLY;
应该返回2015年1月1日员工分配到的组。

我需要帮助的是创建一个连接所有表的语句对整个组执行相同而不是仅一个员工(因为数据库中有数千名员工,我只想要最多10个组的数据)。

我感谢任何指示正确的方向。

1 个答案:

答案 0 :(得分:2)

使用row_number对您的历史记录进行排名并获取最新的组,就像您对FETCH FIRST查询所做的那样:

select *
from
(
  select 
    h.*,
    row_number() over (partition by emp_nr order by valid_from desc) as rn
  from history h 
  where valid_from <= 9131
)
where rn = 1

然后,您可以将此结果与其他表格结合使用。