【问题标题】:Using Variable to make Dynamic Column Aliases in Snowflake使用变量在雪花中制作动态列别名
【发布时间】:2022-01-17 23:57:06
【问题描述】:

我有一个表,其中列出了 12 个月跨多个列的一系列值(即 month_1_value、month_2_value 等),以及指示相关月份的其他列(例如:month_1_name = 202101、month_2_name = 202102 等.)

我正在尝试将其设置为“month_1_value”列将被称为“202101”,month_2_value 将被称为“202102”等。

这通常在 Python 这样的语言中非常容易做到,但我正在努力在 SQL/Snowflake 中找到正确的方法。

我可以使用 set min_month = min(month_1_name) 设置一个变量以包含该值,但我无法将其用作视图中的新别名或我尝试过的存储过程。

我希望实现的总体思路是这样的:

set min_month = min(month_1_name);

SELECT
month_1_value as $min_month
, month_2_value as $min_month+1
.....
FROM
Table

似乎应该有一个相当简单的方法来做到这一点,但我还没有找到它。甚至像首先在Javascript中设置变量,然后让另一个变量将该变量引用为字符串似乎也可以,但我正在努力寻找一个清晰的方法。任何建议将不胜感激。

【问题讨论】:

  • 要在 Snowflake 中动态创建列别名,您需要使用存储过程。在存储过程中创建动态 SQL 很容易,但 Snowflake 存储过程不返回表,只返回标量值。如果这对您有用,我可以编写一个示例,但似乎更喜欢立即拿出一张桌子。没有办法做到这一点。
  • 谢谢格雷格,我想这就是我苦苦挣扎的地方。我对其进行了一些修改,只是创建了一个视图,而我认为它应该适合我的目的。

标签: sql snowflake-cloud-data-platform dynamic-sql


【解决方案1】:

正如 Greg 所说,您将需要一个存储过程。

查看我写的这篇博文:

它专注于做支点,但它有你想要的基础。

基本上,它允许您调用存储过程call pivot_prev_results();,它获取上一个查询的结果,并创建具有动态列名的结果,供下一个查询使用。

在存储过程中创建了一个动态查询,它使用以前的结果:

pivot_query = `
select *
from (select * from table(result_scan(last_query_id(-2))))
pivot(max(pivot_value) for pivot_column in (${col_list}))
`
var stmt2 = snowflake.createStatement({sqlText: pivot_query});
stmt2.execute();

您的存储过程可以执行类似的过程,但要创建一个视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多