Snowflake中有融化命令吗?

Hat*_*ind 6 sql unpivot melt snowflake-cloud-data-platform

是否有一个 Snowflake 命令可以像这样转换表格:

a,b,c
1,10,0.1
2,11,0.12
3,12,0.13
Run Code Online (Sandbox Code Playgroud)

到这样的表:

key,value
a,1
a,2
a,3
b,10
b,11
b,13
c,0.1
c,0.12
c,0.13
Run Code Online (Sandbox Code Playgroud)

?

此操作在其他表格系统中经常被调用melt,但基本思想是将表格转换为键值对列表。

SnowSQL 中有一个UNPIVOT,但据我了解,它UNPIVOT需要手动指定每一列。这对于大量列来说似乎不实用。

Luk*_*zda 10

Snowflake 的 SQL 足够强大,无需第三方工具或其他扩展的帮助即可执行此类操作。

数据准备:

CREATE OR REPLACE TABLE t(a INT, b INT, c DECIMAL(10,2))
AS
SELECT 1,10,0.1
UNION SELECT 2,11,0.12
UNION SELECT 3,12,0.13;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

查询(又名“动态”UNPIVOT):

SELECT f.KEY, f.VALUE
FROM (SELECT OBJECT_CONSTRUCT_KEEP_NULL(*) AS j FROM t) AS s
,TABLE(FLATTEN(input => s.j)) f
ORDER BY f.KEY;
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述


它是如何工作的?

  1. 将行转换为 JSON(第 1 行变为{ "A": 1,"B": 10,"C": 0.1 })
  2. 使用 FLATTEN 将 JSON 解析为键值对