我需要连接表A和表B来创建表C.
表A和表B存储ID的状态标志.状态标志(A_Flag和B_Flag)可以不时更改,因此一个ID可以包含多行,表示ID状态的历史记录.特定ID的标志可以彼此独立地改变,这可以导致表A中的一行属于表B中的多行,反之亦然.
结果表(表C)需要是唯一日期范围的列表,其中包括ID生命周期中的每个日期(01/01/2008-18/08/2008),以及每个日期范围的A_Flag和B_Flag值.
实际表包含数百个ID,每个ID每个表具有不同的行数.
我可以访问SQL和SAS工具来实现最终结果.
Source - Table A
ID Start End A_Flag
1 01/01/2008 23/03/2008 1
1 23/03/2008 15/06/2008 0
1 15/06/2008 18/08/2008 1
Source - Table B
ID Start End B_Flag
1 19/01/2008 17/02/2008 1
1 17/02/2008 15/06/2008 0
1 15/06/2008 18/08/2008 1
Result - Table C
ID Start End A_Flag B_Flag
1 01/01/2008 19/01/2008 1 0
1 19/01/2008 17/02/2008 1 1
1 17/02/2008 23/03/2008 1 0
1 23/03/2008 15/06/2008 0 0
1 15/06/2008 18/08/2008 1 1
Run Code Online (Sandbox Code Playgroud)
我将用 SQL 来解决这个问题,假设你有一个名为lag(SQL Server 2012、Oracle、Postgres、DB2)的函数。使用相关子查询可以获得相同的效果。
这个想法是获取所有不同的时间段。然后连接回原始表以获取标志。
\n\n我在上传代码时遇到问题,但可以获取大部分代码。但是,它从开始结束开始,您可以通过在一列中执行四个日期中的a union(不是)来创建该结束:选择 a.start 作为日期。union all然后将其与 a.end、b.start 和 b.end 联合。
with driver as (\n select thedate as start, lag(thedate) over (order by thedate) as end\n from startends\n )\xc2\xa0\n\nselect startdate, enddate, a.flag, b.flag\nfrom driver left outer join\n a\n on a.start >= driver.start and a.end <= driver.end left outer join\n b\n on b.start >= driver.start and b.end <= driver.end\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6412 次 |
| 最近记录: |