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 循环的主要内容,如果未能解决你的问题,请参考以下文章

for 循环与while循环的区别

循环(while,do...while)

while循环的条件?

while循环与do while循环

while和do-while循环结构

python(10):while循环