gpt4 book ai didi

sql - 加入重叠的日期范围

转载 作者:行者123 更新时间:2023-12-04 01:09:32 26 4
gpt4 key购买 nike

我需要连接表 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

最佳答案

我将在 SQL 中解决这个问题,假设您有一个名为 lag 的函数(SQL Server 2012、Oracle、Postgres、DB2)。您可以使用相关子查询获得相同的效果。

这个想法是获得所有不同的时间段。然后连接回原始表以获取标志。

我在上传代码时遇到问题,但可以获取大部分代码。但是,它以开始结束,您通过执行 union 创建它。 (不是 union all )一列中的四个日期:选择 a.start 作为日期。然后将其与 a.end、b.start 和 b.end 联合。

with driver as (
select thedate as start, lag(thedate) over (order by thedate) as end
from startends


select startdate, enddate, a.flag, b.flag
from driver left outer join
a
on a.start >= driver.start and a.end <= driver.end left outer join
b
on b.start >= driver.start and b.end <= driver.end

关于sql - 加入重叠的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15075717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com