将范围分成行 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,但是您最好重新考虑您的数据模型:-)
我有这样的输入:
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,但是您最好重新考虑您的数据模型:-)