sql - 如何在雪花中展平json字符串列表
问题描述
嗨,我在 Snowflake 中使用表中的一些关系数据工作,该表还包括一个具有 VARIANT 数据类型格式的 JSON 列。我能够操作 JSON 数据并获得我想要的大部分列,但是我遇到了 1 的问题,即数据列表(或数组?)。
下面是原始 JSON 格式的 VARIANT 列的样子。这个专栏被称为product_attributes
,我遇到问题的关键是web_categories
.
{
"data": {
"availability": "available",
"product_company": "macys",
"id": "22345897290",
"price": 5.99,
"web_categories": [
[
"Beauty",
"Makeup",
"Eye Makeup",
"Brows"
]
]
}
}
我基本上想按该id
属性进行分组,然后返回每个单独产品的网络类别数量的不同计数。在这种情况下,我希望返回 4。
select product_attributes:data:id::string as id, count(distinct(t1.value)) as number_of_categories
from mytable, table(flatten(product_attributes:data:web_categories)) t1
group by 1;
但是这个查询不起作用,table flatten 命令返回的 value 列看起来像["Beauty", "Makeup", "Eye Makeup", "Brows"]
这样,当它运行 count 操作时,它只返回 1。我是否必须喜欢将字符串拆分为 (",") 并走那条路线? 这很困难,因为这不是一个普通属性,其中的元素被 {} 分解,这是大多数示例的样子,它只是使用 []。
看起来有 2 种方法用于分解 JSON 数据,但我已经尝试使用这两种方法,但似乎无法得到我想要的。
lateral flatten(input => product_attributes:data:web_categories)
table(flatten(product_attributes:data:web_categories)) t1
如果有人可以帮助我,我将不胜感激!
解决方案
这是一种方法。如果size(web_categories)==1
总是在第一个展平中执行 web_catgories[0],则可以在 1 个展平中执行此操作
with mytable as (select parse_json($1) product_attributes from values ('{
"data": {
"availability": "available",
"product_company": "macys",
"id": "22345897290",
"price": 5.99,
"web_categories": [
[
"Beauty",
"Makeup",
"Eye Makeup",
"Brows"
]
]
}}'))
select product_attributes:data:id::string as id, count(distinct(t1.value)) as number_of_categories
from mytable, lateral flatten(product_attributes:data:web_categories) t0, lateral flatten(t0.value) t1
group by 1;
ID NUMBER_OF_CATEGORIES
22345897290 4
推荐阅读
- typescript - React Native 与 typescript 无法解析模块
- python - python将程序延迟n秒
- javascript - 幻灯片按钮仅在进入最后一张幻灯片时在第二次单击时起作用
- android - 如何在底页对话框上设置矢量背景
- python - TypeError:定义的函数得到了一个意外的关键字参数'许多
- android - 片段中的 Android 视图重叠
- gatsby - Gatsby 页面不会以编程方式从数据中创建
- android - 用手机控制树莓派
- c++ - C++
sort() 使用对象作为比较定义 - javascript - Azure 上的 SQL Server 连接到 REST API Express.js/Node.js [TypeError: req.sql is not a function]