问题描述
ID
是此处的PI。 BEGIN_WINDOW
和END_WINDOW
是TIMESTAMP
列。 DURATION_DAYS_RUP
的计算方法是将DURATION_HRS
除以24并四舍五入。
我想做的是基于DURATION_DAYS_RUP
,我需要创建多行。
- 如果该值为1,则创建的行就是具有相同ID
BEGIN_WINDOW
和END_WINDOW
的同一行。 - 如果大于1,例如。如图2所示,将创建两行-一行
ID
相同,BEGIN_WINDOW
是原始行的值,而END_WINDOW
是24小时+BEGIN_WINDOW
第二行将是相同的ID
,BEGIN_WINDOW
是第一行的END_WINDOW
,而END_WINow
是此行的BEGIN_WINDOW + 24小时。
请参见以下示例:
我进行了很多研究,但似乎找不到执行此操作的窍门。如果有人有想法,将不胜感激!
解决方法
您可以使用Teradata的EXPAND ON
syntax:
SELECT x.ID,BEGIN(pd) as BEGIN_WINDOW,BEGIN(pd) + INTERVAL '24' HOUR as END_WINDOW
FROM mytable x
EXPAND ON PERIOD(x.BEGIN_WINDOW,x.END_WINDOW) AS pd
BY INTERVAL '24' HOUR;
,
您可以使用递归查询:
with recursive cte (id,begin_window,end_window,duration_days_rup) as (
select
id,case when duration_days_rup = 1 then end_window else begin_window + interval '1' day end,duration_days_rup - 1
from mytable
union all
select
id,begin_window + interval '1' day,case when duration_days_rup = 1 then end_window else end_window + interval '1' day end,duration_days_rup - 1
from cte
where duration_days_rup > 0
)
select id,end from cte
查看您的查询,我怀疑您是否确实需要duray_days_rup
列,它是派生信息。我们可以使用直接日期比较。我认为您想要的逻辑是:
with recursive cte (id,real_end_window) as (
select
id,least(end_window,begin_window + interval '1' day),end_window
from mytable
union all
select
id,least(real_end_window,end_window + interval '1' day),real_end_window
from cte
where begin_window + interval '1' day > real_end_window
)
select id,end from cte