Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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 周期表(为每次更改创建行)_Sql_Oracle - Fatal编程技术网

Sql 周期表(为每次更改创建行)

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 预期

我需要创建一个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
预期成果:

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:当记录中只有三个日期时,您怎么可能得到三行以上的结果?不是每个源行有三个结果行吗?