Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle或db2中两个表之间的合并日期范围_Sql_Oracle_Db2 - Fatal编程技术网

Sql oracle或db2中两个表之间的合并日期范围

Sql oracle或db2中两个表之间的合并日期范围,sql,oracle,db2,Sql,Oracle,Db2,我有两个表,其中包含员工的任期和费率数据,如下所示: 1) 任期 E_Id Start_Dt End_Dt 1 1-Jan-2013 31-Dec-2013 1 1-Jan-2014 30-Jun-2014 1 1-Jul-2014 31-Jul-2014 1 1-Aug-2014 31-Dec-2014 2) 费率 E_Id

我有两个表,其中包含员工的任期和费率数据,如下所示:

1) 任期

  E_Id         Start_Dt      End_Dt

    1          1-Jan-2013    31-Dec-2013
    1          1-Jan-2014    30-Jun-2014
    1          1-Jul-2014    31-Jul-2014
    1          1-Aug-2014    31-Dec-2014
2) 费率

E_Id      Rt_Strt_Dt  Rt_End_Dt   Amt

1         1-Jun-2013  30-Nov-2013 100
1         1-Dec-2013  31-Jan-2014 200
1         1-Feb-2014  31-Mar-2014 300
1         1-Apr-2014  31-Jul-2014 400
1         1-Aug-2014  31-Jan-2015 500
E_Id Start_Dt      End_Dt                 Amt

1                 1-Jan-2013 31-May-2013  0
1                 1-Jun-2013 30-Nov-2013  100
1                 1-Dec-2013 31-Dec-2013  200
1                 1-Jan-2014  31-Jan-2014 200
1                 1-Feb-2014 31-Mar-2014  300
1                 1-Apr-2014  31-Jul-2014 400
1                 1-Aug-2014 31-Dec-2014  500
1                 1-Jan-2014 31-Jan-2015  500
我想连接这些表,需要如下输出:

3) Emp\u T

E_Id      Rt_Strt_Dt  Rt_End_Dt   Amt

1         1-Jun-2013  30-Nov-2013 100
1         1-Dec-2013  31-Jan-2014 200
1         1-Feb-2014  31-Mar-2014 300
1         1-Apr-2014  31-Jul-2014 400
1         1-Aug-2014  31-Jan-2015 500
E_Id Start_Dt      End_Dt                 Amt

1                 1-Jan-2013 31-May-2013  0
1                 1-Jun-2013 30-Nov-2013  100
1                 1-Dec-2013 31-Dec-2013  200
1                 1-Jan-2014  31-Jan-2014 200
1                 1-Feb-2014 31-Mar-2014  300
1                 1-Apr-2014  31-Jul-2014 400
1                 1-Aug-2014 31-Dec-2014  500
1                 1-Jan-2014 31-Jan-2015  500

因此,如果开始日期重叠,则通过sqls使用适当的
Amt
将其打断。数据量不大,因此可以编写/完成多个查询/多个扫描,但解决方案应该是动态的。

您可以先仅根据开始日期排列数据,然后使用
lead()重新聚合
功能。我认为以下内容符合您的要求:

select t.e_id, t.start_dte,
       lead(t.start_dte) over (partition by t.e_id order by t.start_dte) as end_dte,
       max(amt)
from ((select e_id, start_dt, 0 as amt
       from tenure_t
      ) union all
      (select e_id, rt_start_dte, amt
       from rate_t
      )
     ) t
group by t.e_id, t.start_dte;

显示您迄今为止尝试过的查询将增加收到有用响应的机会。正如您所知,最好以独占方式存储结束日期,这样您就可以(这是数字如何表示的问题,而不是SQL Server特有的问题)。