Snowflake cloud data platform 有没有一种方法可以将一组列强制转换为相同的数字(p,s)类型,以便在Snowflake SQL中取消对它们的强制转换?

Snowflake cloud data platform 有没有一种方法可以将一组列强制转换为相同的数字(p,s)类型,以便在Snowflake SQL中取消对它们的强制转换?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我有一个表,有几个数字列,都有不同的数字类型。该表是使用创建表xx从xxx GROUP BY date中选择日期、SUMx、SUMy创建的。似乎雪花决定了存储每个结果列所需的最小数字精度和比例。这将导致每个列的类型不同 现在我想取消PIVOT这些列,Snowflake会抱怨SQL编译错误:“xxxxx”列的类型与取消PIVOT列表中其他列的类型冲突 我创建了这个最小表来举例说明这个问题: create or replace temporary table temp1(id number, sal

我有一个表,有几个数字列,都有不同的数字类型。该表是使用创建表xx从xxx GROUP BY date中选择日期、SUMx、SUMy创建的。似乎雪花决定了存储每个结果列所需的最小数字精度和比例。这将导致每个列的类型不同

现在我想取消PIVOT这些列,Snowflake会抱怨SQL编译错误:“xxxxx”列的类型与取消PIVOT列表中其他列的类型冲突

我创建了这个最小表来举例说明这个问题:

create or replace temporary table temp1(id number, sales number(10,0), n_orders number(20,0)) as (
    select * from (values
           (1, 1, 2 )
           ,(2, 3, 4)
           ,(3, 5, 6)
    ) 
); -- imagine that temp1 was created via a select AGG1, AGG2 FROM XXX GROUP BY YYY

describe table temp1;
-- 
name    type    kind    null?   default primary key unique key  check   expression  comment
ID  NUMBER(38,0)    COLUMN  Y       N   N           
SALES   NUMBER(10,0)    COLUMN  Y       N   N           
N_ORDERS    NUMBER(20,0)    COLUMN  Y       N   N           

select * 
from temp1 UNPIVOT(measure_value for measure_name in (sales, n_orders)); -- won't work because SALES is NUMBER(10,0) and N_ORDERS is NUMBER(20,0)

现在,我的解决方法是将每个列都显式地转换为x,例如:

这不是最理想的,因为我使用的实际表中有很多列

我不想重新创建表,聚合需要很长时间才能计算,那么我的选择是什么


是否有其他语法可用于批量转换列列表?

您最好的选择是修改已创建的表,而无需重新运行代价高昂的聚合,如下所示:

alter table temp1 modify
  sales set data type number(38,0)
  ,n_orders set data type number(38,0)
;
这种方式有两个优点:

避免为每列键入两次列名:column\u name设置数据类型number38,而不是TO\u NUMBERcolumn\u name,38,0作为column\u name 它只运行一次,而不必在每次UNPIVOT查询之前作为CTE运行。
应该注意的是,在Snowflake中,除了定义数字38,0或只定义没有p,s的数字之外,没有任何存储或性能成本。最终用户BI工具有时会根据这些值增加存储空间,但就Snowflake而言,没有理由限制数字的长度。VARCHAR也是如此。是的,但雪花会自动为不同的聚合选择不同的编号。我没有选择自己的号码30,0或号码31,0。我刚刚创建或替换了表xxx作为SELECT ID,maxxx作为b,MINyyy作为c,从zzz GROUP BY ID生成的b和c列有不同的编号,xxx和yyy的数据类型是什么?
alter table temp1 modify
  sales set data type number(38,0)
  ,n_orders set data type number(38,0)
;