对跨标准和变体类型列的查询执行聚合函数

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)

SQL语句汇总——聚合函数分组子查询及组合查询

SQL聚合函数

DDD - 如何对跨聚合的集合强制执行不变量

EasyClick 之 MySQL 条件查询之聚合函数

MySQL 聚合函数 和 分组查询(初级)