将范围分成行 Teradata

Break ranges into rows Teradata

我有这样的输入:

Start     End
1         100

我会link将每个范围分成几行:

ID
1
2
3
4
.
.
.
100

我正在尝试在 TERADATA 中获取此输出,你们能帮帮我吗?

非常感谢。

一种方法是递归 CTE:

with recursive cte (n, end) as (
      select start, end
      from t
      union all
      select n + 1, end
      from cte
      where n < end
     )
select n
from cte;

注意:您可以在 cte 中包括其他列,因此您可以拆分每一行并仍然有其他信息,例如 id 或其他信息。

Teradata 的专有 EXPAND ON 语法用于创建 时间序列 ,但也可用于您的任务。假设 TD16.20+ 这可以使用 时间序列 函数进一步简化:

如果开始和结束是正整数:

select t.*
   ,TD_TIME_BUCKET_NUMBER(time '00:00:00.000000+00:00', begin(pd), microseconds(1)) - 1 -- TD 16.20
from mytable as t
expand on -- works on date/time only -> convert int to period
   period(time '00:00:00.000000+00:00' + (interval '0.000001' second * start_)
         ,time '00:00:00.000001+00:00' + (interval '0.000001' second * end_)
         ) as pd 

BIGINT 有点复杂,必须嵌套:

select dt.*
   ,start_ + rownum - 1
from
 (
   select t.*
      ,TD_TIME_BUCKET_NUMBER(timestamp '0001-01-01 00:00:00.000000+00:00', begin(pd), microseconds(1) ) as rownum
   from mytable as t
   expand on -- works on date/time only -> convert int to period
      period(timestamp '0001-01-01 00:00:00.000000+00:00'
            ,timestamp '0001-01-01 00:00:00.000001+00:00' + (interval '0.000001' second * (end_ - start_))
            ) as pd 
 ) as dt
 ;
 

这允许创建多达 9,999,999,999 行,如果您需要更多(最多 863,999,999,999,999),您可以切换到 INTERVAL DAY TO SECOND,但是您最好重新考虑您的数据模型:-)