我有一个来自 IoT 中心的流,例如:
{
"store_id": "111",
"data": [
{
"timestamp": "2018-04-06T11:46:11.842305",
"book_id": "001",
"author_id": "101"
},
{
"timestamp": "2018-04-06T11:46:11.842306",
"book_id": "002",
"author_id": "102"
},
{
"timestamp": "2018-04-06T11:46:11.842307",
"book_id": "003",
"author_id": "103"
}
]
}
我想在 SQL DB 中传递这个流,如下所示:
id id_type timestamp
001 book_id 2018-04-06T11:46:11.842305
101 author_id 2018-04-06T11:46:11.842305
002 book_id 2018-04-06T11:46:11.842306
102 author_id 2018-04-06T11:46:11.842306
003 book_id 2018-04-06T11:46:11.842307
103 author_id 2018-04-06T11:46:11.842307
有没有办法使用交叉应用
或其他方式从多json元素创建两个新列
最佳答案
如果它是静态数据透视表(您提前知道字段列表,并且可以对它们的值进行硬编码),那么您将得到如下结果:
WITH Unfolding AS (
SELECT
d.ArrayValue.*
FROM input i
CROSS APPLY GetArrayElements(i.data) d
),
Books AS (
SELECT
timestamp,
book_id as id,
'book' as id_type
FROM Unfolding
),
Authors AS (
SELECT
timestamp,
author_id as id,
'author' as id_type
FROM Unfolding
),
AllRecords AS (
SELECT timestamp, id, id_type FROM Books
UNION
SELECT timestamp, id, id_type FROM Authors
)
SELECT
*
INTO output
FROM AllRecords
您创建一个CTE最后提取每个实体并将它们全部合并。
如果您有动态值,则需要使用 JavaScript UDF 。遗憾的是我没有代码示例。它应该很简单(但有点痛苦)。
关于sql - 在流分析中将列逆透视为两个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70429418/