Snowflake cloud data platform 从变体表横向展平雪花
我有一个名为Snowflake cloud data platform 从变体表横向展平雪花,snowflake-cloud-data-platform,flatten,snowflake-schema,lateral,Snowflake Cloud Data Platform,Flatten,Snowflake Schema,Lateral,我有一个名为raw_json的变量表,其中包含多个json文件,这些文件对于ID是唯一的,但在每个json中包含相似的数据点。它们位于jsontext列中。这是一个上下文的SS。我正在尝试将raw_json表的每一行展平到一个普通的表视图中。两个数组索引需要对齐以分配正确的值 下面是raw_json表中的两行,以及json的结构 { "ID": "PO-103", "content": { "EEList": [ { "EEListID": "PO-103-1
raw_json
的变量表,其中包含多个json文件,这些文件对于ID是唯一的,但在每个json中包含相似的数据点。它们位于jsontext列中。这是一个上下文的SS。我正在尝试将raw_json
表的每一行展平到一个普通的表视图中。两个数组索引需要对齐以分配正确的值
下面是raw_json
表中的两行,以及json的结构
{
"ID": "PO-103",
"content": {
"EEList": [
{
"EEListID": "PO-103-1",
"EEProductID": "XXX1976",
},
{
"EEListID": "PO-103-2",
"EEProductID": "XXX1977",
},
{
"EEListID": "PO-103-3",
"EEProductID": "XXX1978",
}
],
"EENotesList": [
{
"FirstName": "John",
"LastName": "Smith",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Bob",
"LastName": "Joe",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Mike",
"LastName": "Smith",
"pxObjClass": "XX-XXSales-Work-XX"
}
],
}
}
像这样的桌子里(我需要这个)
我已经能够将eNoteList数组展平到一个表中,并为该表分配正确的ID。到目前为止,我的代码是这样的:在不扇出表格的情况下添加EEList值是我出错的地方
select
jsontext:ID::varchar as ID,
en.value:FirstName::varchar as FirstName,
en.value:LastName::varchar as LastName,
en.value:pxObjClass::varchar as pxObjClass
-- concat(ID, EEProductID, FirstName, LastName)
from raw_json,
lateral flatten (input => jsontext:content:EENotesList, outer => false) en;
它产生了这个表(我有这个)
因此,这个答案主要是将数据放入CTE的序言,但是“iff”两个数组的顺序是同步的,您可以使用展平的索引来访问其他类型的原始数组:
WITH raw_json AS (
select PARSE_json(column1) AS jsontext FROM VALUES
('{
"ID": "PO-103",
"content": {
"EEList": [
{
"EEListID": "PO-103-1",
"EEProductID": "XXX1976",
},
{
"EEListID": "PO-103-2",
"EEProductID": "XXX1977",
},
{
"EEListID": "PO-103-3",
"EEProductID": "XXX1978",
}
],
"EENotesList": [
{
"FirstName": "John",
"LastName": "Smith",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Bob",
"LastName": "Joe",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Mike",
"LastName": "Smith",
"pxObjClass": "XX-XXSales-Work-XX"
}
],
}
}'), ('{
"ID": "PO-104",
"content": {
"EEList": [
{
"EEListID": "PO-104-1",
"EEProductID": "XXX1979",
},
{
"EEListID": "PO-104-2",
"EEProductID": "XXX1980",
},
{
"EEListID": "PO-104-3",
"EEProductID": "XXX1981",
}
],
"EENotesList": [
{
"FirstName": "Sarah",
"LastName": "Butler",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Jessica",
"LastName": "Adams",
"pxObjClass": "XX-XXSales-Work-XX"
}
],
}
}')
)
select
jsontext:ID::varchar as ID,
en.value:FirstName::varchar as FirstName,
en.value:LastName::varchar as LastName,
en.value:pxObjClass::varchar as pxObjClass,
jsontext:content.EEList[en.index].EEListID::text as EEListID,
jsontext:content.EEList[en.index].EEProductID::text as EEProductID
from raw_json,
lateral flatten (input => jsontext:content:EENotesList, outer => false) en;
这导致:
ID FIRSTNAME LASTNAME PXOBJCLASS EELISTID EEPRODUCTID
PO-103 John Smith XX-XXSales-Work-XX PO-103-1 XXX1976
PO-103 Bob Joe XX-XXSales-Work-XX PO-103-2 XXX1977
PO-103 Mike Smith XX-XXSales-Work-XX PO-103-3 XXX1978
PO-104 Sarah Butler XX-XXSales-Work-XX PO-104-1 XXX1979
PO-104 Jessica Adams XX-XXSales-Work-XX PO-104-2 XXX1980
这正是我要找的!您在哪里找到如何使用EEList[en.index]?在Snowflake文档中找不到任何索引。能否展开答案的第一部分?我从来没有使用过CTE,也没有使用过上下文。我只是假设它在很久以前可以工作,因为它是JSON对象上的Javascript访问样式。。我很确定还有一个像访问器一样的get_成员。我只是使用
或:
来访问子元素。CTE(公共表表达式)是一个表达式,它使命名表类似于您可以在其他地方访问的内容,非常类似于带有别名的子选择,但如果您多次加入该子表达式,则不需要多次定义它。。我经常使用逻辑上独立的处理步骤,因为优化器可以并且确实会将所有步骤混合在一起,就像它是子选择一样。。。
+--------+-----------+----------+-------------------+
| ID | FirstName | LastName | pxObjClass |
+--------+-----------+----------+-------------------+
| PO-103 | John | Smith | X-XXSales-Work-XX |
| PO-103 | Bob | Joe | X-XXSales-Work-XX |
| PO-103 | Mike | Smith | X-XXSales-Work-XX |
| PO-104 | Sarah | Butler | X-XXSales-Work-XX |
| PO-104 | Jessica | Adams | X-XXSales-Work-XX |
| PO-104 | Terrence | Williams | X-XXSales-Work-XX |
+--------+-----------+----------+-------------------+
WITH raw_json AS (
select PARSE_json(column1) AS jsontext FROM VALUES
('{
"ID": "PO-103",
"content": {
"EEList": [
{
"EEListID": "PO-103-1",
"EEProductID": "XXX1976",
},
{
"EEListID": "PO-103-2",
"EEProductID": "XXX1977",
},
{
"EEListID": "PO-103-3",
"EEProductID": "XXX1978",
}
],
"EENotesList": [
{
"FirstName": "John",
"LastName": "Smith",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Bob",
"LastName": "Joe",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Mike",
"LastName": "Smith",
"pxObjClass": "XX-XXSales-Work-XX"
}
],
}
}'), ('{
"ID": "PO-104",
"content": {
"EEList": [
{
"EEListID": "PO-104-1",
"EEProductID": "XXX1979",
},
{
"EEListID": "PO-104-2",
"EEProductID": "XXX1980",
},
{
"EEListID": "PO-104-3",
"EEProductID": "XXX1981",
}
],
"EENotesList": [
{
"FirstName": "Sarah",
"LastName": "Butler",
"pxObjClass": "XX-XXSales-Work-XX"
},
{
"FirstName": "Jessica",
"LastName": "Adams",
"pxObjClass": "XX-XXSales-Work-XX"
}
],
}
}')
)
select
jsontext:ID::varchar as ID,
en.value:FirstName::varchar as FirstName,
en.value:LastName::varchar as LastName,
en.value:pxObjClass::varchar as pxObjClass,
jsontext:content.EEList[en.index].EEListID::text as EEListID,
jsontext:content.EEList[en.index].EEProductID::text as EEProductID
from raw_json,
lateral flatten (input => jsontext:content:EENotesList, outer => false) en;
ID FIRSTNAME LASTNAME PXOBJCLASS EELISTID EEPRODUCTID
PO-103 John Smith XX-XXSales-Work-XX PO-103-1 XXX1976
PO-103 Bob Joe XX-XXSales-Work-XX PO-103-2 XXX1977
PO-103 Mike Smith XX-XXSales-Work-XX PO-103-3 XXX1978
PO-104 Sarah Butler XX-XXSales-Work-XX PO-104-1 XXX1979
PO-104 Jessica Adams XX-XXSales-Work-XX PO-104-2 XXX1980