Sql 周期表(为每次更改创建行)
我需要创建一个cycles表,每次更新一行。下表显示了两行,但在一个ID下可以有许多分配 我有下表:Sql 周期表(为每次更改创建行),sql,oracle,Sql,Oracle,我需要创建一个cycles表,每次更新一行。下表显示了两行,但在一个ID下可以有许多分配 我有下表: ID class_start class_end enroll_dt reason assignments cat_added 1 1/10/19 1/22/19 1/18/19 stop 1/14/19 1/10/19 1 1/10/19 1/22/19 1/18/19 stop 1/22/19 1/10/19 预期
ID class_start class_end enroll_dt reason assignments cat_added
1 1/10/19 1/22/19 1/18/19 stop 1/14/19 1/10/19
1 1/10/19 1/22/19 1/18/19 stop 1/22/19 1/10/19
预期成果:
class_start class_end start_dt end_dt enroll_dt reason assignments cat_added
1/10/19 1/10/19 1/13/19 1/10/19
1/10/19 1/14/19 1/17/19 1/14/19 1/10/19
1/10/19 1/18/19 1/21/19 1/18/19 1/14/19 1/10/19
1/10/19 1/22/19 1/22/19 12/31/9999 1/18/19 stop 1/22/19 1/10/19
您还没有解释您试图实现的业务逻辑。因此,这个解决方案只是硬编码一些从您发布的数据中派生的规则 它使用connect by level从一个输入行生成多行。在本例中,它使用基于dual的子查询和tests level有条件地填充结果集中的列
with cte as (
select to_date( '1/7/19', 'MM/DD/YY') as class_start,
to_date( '1/14/19', 'MM/DD/YY') as class_end,
to_date( '1/9/19', 'MM/DD/YY') as enroll_dt,
'early' as reason
from dual
)
select cte.class_start
, case when level = 3 then cte.class_end
end as class_end
, case when level = 1 then cte.class_start
when level = 2 then cte.enroll_dt
else cte.class_end - 1
end as st_dt
, case when level = 1 then cte.enroll_dt - 1
when level = 2 then cte.class_end
else date '9999-12-31'
end as end_dt
, case when level > 1 then cte.enroll_dt end as enroll_dt
, case when level = 3 then cte.reason end as reason
from cte
connect by level <= 3
/
如果您有多个输入行,可能会遇到最大的问题。在这种情况下,您将需要一个已标识的链接来将生成的行链接在一起。大概您的实际表有某种标识符。请在此添加有意义的代码和问题描述。发布一个能证明你的问题的帖子会帮助你得到更好的答案。谢谢你的问题是什么?你有没有已经尝试过的代码?一步一步地做。编写查询以获取第一个结果行。编写查询以获取第二个结果行。编写查询以获取第三个结果行。最后,将结果与UNION ALL粘合在一起。我如何按级别管理连接我怀疑您的实际用例比您发布的示例更复杂,这就是为什么我的介绍非常具体地说明了我的代码解决了什么问题。至于更改级别,我希望在确定某行的原因时停止该行,因为您的示例输入只有一行。现在你说你有多行。您需要发布与您的实际情况相匹配的输入数据,以及从该示例派生的所需输出。@John:当记录中只有三个日期时,您怎么可能得到三行以上的结果?不是每个源行有三个结果行吗?