Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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:将小跨度变成1个大连续跨度_Sql_Teradata - Fatal编程技术网

SQL:将小跨度变成1个大连续跨度

SQL:将小跨度变成1个大连续跨度,sql,teradata,Sql,Teradata,我有一些数据,一段时间后,一类数据可以更新 ID Type Start End 1 A 01/01/2017 02/01/2017 1 A 02/01/2017 03/01/2017 1 A 03/01/2017 05/01/2017

我有一些数据,一段时间后,一类数据可以更新

         ID       Type         Start           End
         1         A            01/01/2017     02/01/2017
         1         A            02/01/2017     03/01/2017
         1         A            03/01/2017     05/01/2017
         1         A            04/01/2017     06/01/2017
         1         A            09/01/2017     10/01/2017
我目前正在做以下工作

   SELECT 
       A.ID,
       A.Type,
       B.Start,
       A.End
   FROM my_data as A
   INNER JOIN my_data as B
       ON A.ID = B.ID
       AND A.start>B.start
       AND A.start < B.end
   WHERE A.type = B.Type
    AND A.end-B.start <=365;
我只是在新桌子上重复类似的逻辑。但在现实生活中,这需要很多次,感觉应该有一个更简单的解决方案

我想要的桌子是这样的:

        ID          Type     Start           End
         1           A       01/01/2017      06/01/2017 
         1           A       09/01/2017      10/01/2017

Teradata提供了标准SQL的良好扩展,以规范重叠范围:

SELECT 
   ID
  ,Type
  -- split the period back into seperate dates
  ,Begin(pd) AS Start
  ,End(pd) AS End
FROM
 (
   SELECT NORMALIZE 
      ID
     ,Type
     -- NORMALIZE only works with periods, so create it on the fly
     ,PERIOD(Start, End) AS pd
   FROM my_data 
 ) AS dt
SELECT 
   ID
  ,Type
  -- split the period back into seperate dates
  ,Begin(pd) AS Start
  ,End(pd) AS End
FROM
 (
   SELECT NORMALIZE 
      ID
     ,Type
     -- NORMALIZE only works with periods, so create it on the fly
     ,PERIOD(Start, End) AS pd
   FROM my_data 
 ) AS dt