HANA While 循环
Posted
技术标签:
【中文标题】HANA While 循环【英文标题】:HANA While Loop 【发布时间】:2021-08-08 02:26:10 【问题描述】:我有一个要求,我认为一个可能的解决方案,但我想先验证它以确保它是最佳方法。
当前有一个视图需要添加 2 个新字段。第一个字段将以这样的方式分布,即没有一天超过 24 个。分配将从开始日期开始,并在每个日历日继续进行,直到所需时间全部用完。机器使用的每一天都会输入一个新的日期。
例如,一台机器需要 80 小时才能完成一个零件。新的输出将创建 4 条相同的记录,但新的日期和时间必填字段除外,如下所示。
Date | Hours required |
---|---|
June 1 | 24 |
June 2 | 24 |
June 3 | 24 |
June 4 | 8 |
我的想法是创建一个表函数并使用 while 循环不断检查具有所需小时数的当前字段,并检查它是否大于 0 并减去 24 直到小于 24,这将是最后的入口。每次通过循环时,它还会将开始日期增加 1 天。然后我会将表格函数放在图形视图中,然后前端可以使用它。
任何反馈都将不胜感激!
【问题讨论】:
24 是否为常数?所有数据是否相同或日期可能不同(例如周日不能超过 5 个)?我希望它也可以以图形方式实现,但循环是可能的解决方案,因为 HANA 没有递归 CTE 现在 24 小时是不变的。 【参考方案1】:假设您的表格具有以下结构:
CREATE COLUMN TABLE "MachineCapacityHrs"(
"Machine" nvarchar(10),
"TotalHoursRequired" int,
"StartDate" date
)
然后您可以在表函数中使用以下语句生成所需的日期和时间,而无需使用循环:
select e."Machine",e."TotalHoursRequired",e."StartDate",
t.date_sql as "DateSequence" ,
case when e."EndDate"<>t.date_sql then 24 else "Hrs" end as "HrsRequired"
from
( select "Machine","TotalHoursRequired","StartDate",
add_days("StartDate",case when floor("TotalHoursRequired"/24)=0 then 0
else floor("TotalHoursRequired"/24) end
) as "EndDate",
floor("TotalHoursRequired"/24) as "Days",
mod("TotalHoursRequired",24) as "Hrs",
case when mod("TotalHoursRequired",24) >0 then floor("TotalHoursRequired"/24)+1 else floor("TotalHoursRequired"/24) end as "DateCount"
from "MachineCapacityHrs"
)e left outer join ( select date_sql from _sys_bi.m_time_dimension
)t on t.date_sql between e."StartDate" and e."EndDate"
结果: enter image description here
【讨论】:
请原谅空格:)以上是关于HANA While 循环的主要内容,如果未能解决你的问题,请参考以下文章