sql - 雪花中有融化命令吗?
问题描述
是否有一个 Snowflake 命令可以像这样转换表格:
a,b,c
1,10,0.1
2,11,0.12
3,12,0.13
到这样的表:
key,value
a,1
a,2
a,3
b,10
b,11
b,13
c,0.1
c,0.12
c,0.13
?
这个操作在其他表格系统中经常被调用melt
,但基本思想是将表格转换成键值对的列表。
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 解析为键值对
推荐阅读
- flutter - 如何获取 Flutter App 中使用的包版本
- c# - 如何保持属性同步
- php - 如何在wordpress自定义帖子上设置帖子数量
- download - GIT repo 下载但不结帐
- python - Django - 案例为假时过滤
- c# - Sustainsys.Saml2 在普通 Asp.Net Core MVC Web 应用程序中的集成
- c++ - 如何重写我的宏以与 IDE 自动格式配合使用?
- java - 应用程序因使用 com.github.glomadrian.materialanimatedswitch.MaterialAnimatedSwitch 而崩溃
- spacy - 我可以使用 Spacy 进行名词分类吗?
- node.js - 如何检查某些用户是否订阅了频道?(非组)