Snowflake Procedure - 为每个未透视的行生成年份和月份

Snowflake Procedure - generate year and month for each unpivoted row

我正在尝试创建一个雪花过程以将列反转为行。在逆透视期间,我需要为每一列填充年份和月份。该过程的参数将是当前月份和年份。

我需要进行逆透视并使用滑动 window year_num 和 month_num 填充每一行。即对于每个逆轴,列 'num' 应该开始填充来自源 table 的 'num_1' 以及(当前日期 - 5 年)并填充相应的 year_num 和 month_num 作为单独的列。

因此,根据当前日期(2021 年 8 月 2 日),num_1 应该是逆透视的,并填充 08 作为 month_num 和 2016 作为 year_num。类似地,同一源行的 num_2 列在 unpivot 之后应该有 09 作为 month_num 和 2016 作为 year_num 在目标中作为单独的行。

对于专栏,从 2016 年到 2028 年,这应该持续到 12 年,直到 num_146。

示例:

snowflake 中的来源 table 从 num_1 到 num_146

有名为 num 的列

source table structure

我使用 insert into target_table id, name, num, year, month Select from source table unpivot(num for columnname in (num_1, num_2, num_3 ......................直到 num_146);

但是,我不知道如何实现当前日期 -5 年的滑动 window 概念来提取月份、年份并在接下来的 12 年中递增它们,直到我们到达每一行的末尾, 并为所有反旋转做同样的事情。

Target table after unpivot

谁能帮助我如何在基于 javascript 的 Snowflake 程序中实现这一点?

谢谢。

下面是我在 SQL 中的解决方法,我想您可以将逻辑合并到您的程序中。

逆透视时,添加一个代表行号的列。这将帮助您计算偏移月份和年份。可以使用row_number()函数来获取

row_number() over(partition by null order by null) as RN

然后用这一列计算偏移年月(假设current_date是时间起点)

year(add_months(current_date, RN - 61)) as year,
month(add_months(current_date, RN - 61)) as month

从第一行减去 61 个月将得到 -60,即 5 年前的月份和年份,即 2016 年 8 月。如果最后一行是 146,则减去 61 将得到 85 即 85几个月后,即 2028 年 9 月。

最后,如果输入参数是月和年(分别命名为p_month和p_year),您可以用date_from_parts函数替换current_date

year(add_months(date_from_parts(p_year, p_month, 01 ), RN - 61)) as year,
month(add_months(date_from_parts(p_year, p_month, 01 ), RN - 61)) as month