Snowflake 中有 melt 命令吗?
Is there a melt command in Snowflake?
是否有 Snowflake 命令可以像这样转换 table:
a,b,c
1,10,0.1
2,11,0.12
3,12,0.13
变成这样的table:
key,value
a,1
a,2
a,3
b,10
b,11
b,13
c,0.1
c,0.12
c,0.13
?
这种操作在其他表格系统中常被称为melt
,但其基本思想是将table转换为键值对列表
SnowSQL 中有一个 UNPIVOT
,但据我了解,UNPIVOT
需要手动指定每一列。对于大量的列,这似乎不切实际。
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;
查询(又名“动态”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;
输出:
它是如何工作的?
- 将行转换为 JSON(第 1 行变为
{ "A": 1,"B": 10,"C": 0.1 }
)
- 使用 FLATTEN
将 JSON 解析为键值对
是否有 Snowflake 命令可以像这样转换 table:
a,b,c
1,10,0.1
2,11,0.12
3,12,0.13
变成这样的table:
key,value
a,1
a,2
a,3
b,10
b,11
b,13
c,0.1
c,0.12
c,0.13
?
这种操作在其他表格系统中常被称为melt
,但其基本思想是将table转换为键值对列表
SnowSQL 中有一个 UNPIVOT
,但据我了解,UNPIVOT
需要手动指定每一列。对于大量的列,这似乎不切实际。
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;
查询(又名“动态”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;
输出:
它是如何工作的?
- 将行转换为 JSON(第 1 行变为
{ "A": 1,"B": 10,"C": 0.1 }
) - 使用 FLATTEN 将 JSON 解析为键值对