如何在 Snowflake 中展平 json 字符串列表
How to flatten out a json list of strings in Snowflake
您好,我在 Snowflake 中处理 table 中的一些关系数据,其中还包括具有 VARIANT 数据类型格式的 JSON 列。我能够操作 JSON 数据并获取我想要的大部分列,但我在处理 1 数据列表(或数组?)时遇到了问题。
下面是 VARIANT 列的原始 JSON 格式。此专栏名为 product_attributes
,我遇到问题的关键是 web_categories
。
{
"data": {
"availability": "available",
"product_company": "macys",
"id": "22345897290",
"price": 5.99,
"web_categories": [
[
"Beauty",
"Makeup",
"Eye Makeup",
"Brows"
]
]
}
}
我基本上想按 id
属性分组,然后 return 每个产品的网络类别数量的不同计数。在这种情况下,我希望 return 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;
但是这个查询不起作用,return 由 table flatten 命令编辑的值列看起来像 ["Beauty", "Makeup", "Eye Makeup", "Brows"]
所以当它运行计数操作时它只 returns 1. 我是否必须喜欢用 (",") 分割字符串然后走那条路?这很困难,因为这不是普通属性,元素被 {} 分解,大多数示例看起来都是这样,它只是使用 [].
似乎有 2 种方法可用于分解 JSON 数据,但我已尝试使用这两种方法,但似乎无法得到我想要的结果。
lateral flatten(input => product_attributes:data:web_categories)
table(flatten(product_attributes:data:web_categories)) t1
如果有人能帮助我,我将不胜感激!
这是一种方法。如果 size(web_categories)==1
总是通过在第一个 flatten
中执行 web_catgories[0],则可以在 1 flatten 中执行此操作
with mytable as (select parse_json() 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
您好,我在 Snowflake 中处理 table 中的一些关系数据,其中还包括具有 VARIANT 数据类型格式的 JSON 列。我能够操作 JSON 数据并获取我想要的大部分列,但我在处理 1 数据列表(或数组?)时遇到了问题。
下面是 VARIANT 列的原始 JSON 格式。此专栏名为 product_attributes
,我遇到问题的关键是 web_categories
。
{
"data": {
"availability": "available",
"product_company": "macys",
"id": "22345897290",
"price": 5.99,
"web_categories": [
[
"Beauty",
"Makeup",
"Eye Makeup",
"Brows"
]
]
}
}
我基本上想按 id
属性分组,然后 return 每个产品的网络类别数量的不同计数。在这种情况下,我希望 return 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;
但是这个查询不起作用,return 由 table flatten 命令编辑的值列看起来像 ["Beauty", "Makeup", "Eye Makeup", "Brows"]
所以当它运行计数操作时它只 returns 1. 我是否必须喜欢用 (",") 分割字符串然后走那条路?这很困难,因为这不是普通属性,元素被 {} 分解,大多数示例看起来都是这样,它只是使用 [].
似乎有 2 种方法可用于分解 JSON 数据,但我已尝试使用这两种方法,但似乎无法得到我想要的结果。
lateral flatten(input => product_attributes:data:web_categories)
table(flatten(product_attributes:data:web_categories)) t1
如果有人能帮助我,我将不胜感激!
这是一种方法。如果 size(web_categories)==1
总是通过在第一个 flatten
with mytable as (select parse_json() 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