雪花无阻

时间:2020-06-10 19:31:33

标签: pivot snowflake-cloud-data-platform unpivot

我需要转置一个表,其中column1是实体的名称,column2到column366是持有美元金额的一年中的日期。该表,选择语句和输出结果均已给出 下方-

问题-这种语法要求我创建一个用逗号分隔的列列表-基本上是365个日期-并在select语句的IN子句中使用该列表。

喜欢-

..... unpivot(用于(“ 1-1-2020”,“ 1-2-2020”,“ 1-3-2020” ...... “ 12-31-2020” ))按2

排序

还有更好的方法吗?喜欢使用正则表达式吗?我不想以 mm-dd-yyyy 格式输入365个日期,以免遇到麻烦

这是表格-第一行是列标题,第二行是分隔符。第三,第四和第五行是样本数据。

Name                  01-01-2020            01-02-2020          01-03-2020           12-31-2020
---------------------------------------------------------------------------------------------------
Entity1               10.00                 15.75               20.00                100.00
Entity2               11.00                 16.75               20.00                 10.00
Entity3              112.00                166.75               29.00                108.00

我可以使用下面的select语句将其转置

从表1中选择* 取消枢纽(((1-1-2020”,“ 1-2-2020”,“ 1-3-2020”中的日期为现金))按2

获得类似下面的输出-

    Name-------------------dates-----------------------cash
    --------------------------------------------------------------
    Entity1                01-01-2020                   10.00
    Entity2                01-01-2020                   11.00
    Entity3                01-01-2020                  112.00

...............................
.............................
.........
and so on

1 个答案:

答案 0 :(得分:1)

没有PIVOT,有一种更简单的方法来执行此操作。 Snowflake为您提供了将整个行表示为“对象”的功能-键值对的集合。使用该表示形式,您可以对每个元素进行FLATTEN处理,并提取列名(键==日期)和其中的值(值=​​= cash)。这是一个可以做到的查询:

with obj as (
   select OBJECT_CONSTRUCT(*) o from Table1
)
select o:NAME::varchar as name, 
       f.key::date as date, 
       f.value::float as cash  
from obj,
     lateral flatten (input => obj.o, mode => 'OBJECT') f
where f.key != 'NAME'
;