对跨标准和变体类型列的查询执行聚合函数
Posted
技术标签:
【中文标题】对跨标准和变体类型列的查询执行聚合函数【英文标题】:Doing aggregate functions on queries across standard and variant typed columns 【发布时间】:2019-12-19 19:08:24 【问题描述】:我希望利用雪花中的变体功能。我是雪花的新手,从文档中看不到它是否支持我想做的事情。我想对一个表执行查询,在该表中我对具有标准类型(varchar、int ... ...)和从变量列中提取的值的列进行聚合(分组)。我的变量列将存储一组对象,如下所示:
"container": [
"param1": "value1a",
"param2": "value2a",
"param3": "value3a"
,
"param1": "value1b",
"param2": "value2b",
"param3": "value3b"
,
"param1": "value1c",
"param2": "value2c",
"param3": "value3c"
]
在传统的 sql 模式中显示我正在尝试做的事情让我们说我有一个 1:n 的关系,其中容器是许多上的一个孩子,带有一个 fk(parent_id)来指定 rel(对父母说)。这是我试图在传统 sql/关系模型中表示的变体列上编写的一种查询:
SELECT P.column1, P.column2, C.param1, C.param2
FROM parent P
INNER JOIN Child c ON c.parent_id = p.id
GROUP BY 1, 2, 3
【问题讨论】:
您能否添加预期的查询结果/输出? 到目前为止,您尝试了什么。如果没有,我会先研究 Snowflake 的 FLATTEN 功能。它将您的数组爆发成记录,这将模仿您的 1:n 关系:docs.snowflake.net/manuals/sql-reference/functions/flatten.html @DavidGarrison 。是的,对此感到抱歉。我的示例变体数据也有问题。假设 param1 的值在所有三个对象“value1a”中都相同,而 param2 的值 (value1b) 在前 2 个对象中相同。正如其他人指出的那样,我的聚合函数是一个简单的 count(1) 作为 the_count。 ``` column1, column2, param1, param2, the_count -------------------------------------------------- -------------------------- siteX, pageY, value1a, value1b,2 siteA,pageB,value1a,value1b,1 siteC,pageC,value1a, value1c,1 ``` 呃。回复的格式是个坏消息。这个网站上的新海报。对不起大卫 G。 【参考方案1】:您将需要使用FLATTEN 命令来访问对象的各个部分。
因此要访问您将使用的container
的三个参数
WITH input_tab AS (
select PARSE_JSON(' "container": [ "param1": "value1a", "param2": "value2a", "param3": "value3a" , "param1": "value1b", "param2": "value2b", "param3": "value3b" , "param1": "value1c", "param2": "value2c", "param3": "value3c" ]') as json
)
SELECT f.value:param1,
f.value:param2,
f.value:param3
--,f.* -- here so you can see the other parts.
FROM input_tab AS i,
TABLE(flatten(input => i.json, path => 'container')) f;
给予:
F.VALUE:PARAM1 F.VALUE:PARAM2 F.VALUE:PARAM3
"value1a" "value2a" "value3a"
"value1b" "value2b" "value3b"
"value1c" "value2c" "value3c"
您需要使用 TRY_TO_x 或 AS_x 转换函数将其解析为类型数据。
【讨论】:
【参考方案2】:很好的问题,不确定您打算使用哪个聚合函数,因为您的示例中没有它并且您的值是字符串,因此您的聚合函数是有限的。
温度表(方便使用)
CREATE OR REPLACE TEMP TABLE X
AS
SELECT PARSE_JSON(COLUMN1) AS C1
FROM VALUES
($$
"container": [
"param1": "value1a",
"param2": "value2a",
"param3": "value3a"
,
"param1": "value1b",
"param2": "value2b",
"param3": "value3b"
,
"param1": "value1c",
"param2": "value2c",
"param3": "value3c"
]
$$);
选项 1
SELECT C1
,F1.*
,F1.VALUE['param2']
FROM X
,LATERAL FLATTEN (INPUT => C1['container']) F1
;
选项 2
SELECT C1
,F1.*
,F2.*
FROM X
,LATERAL FLATTEN (INPUT => C1['container']) F1
,LATERAL FLATTEN (INPUT => F1.VALUE) F2
【讨论】:
以上是关于对跨标准和变体类型列的查询执行聚合函数的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用groupby函数agg函数获取每个分组聚合对应的标准差(std)实战:计算分组聚合单数据列的标准差(std)计算分组聚合多数据列的标准差(std)