sql - 在流分析中将列逆透视为两个新列

标签 sql azure azure-stream-analytics

我有一个来自 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/

相关文章:

sql - 我在这个 MySQL 存储过程中做错了什么?

mysql - 我可以简化这个 MySQL 查询吗?

azure - 将 Windows Azure Web 角色升级到 Server 2008 R2 以使用 IIS 7.5

azure - 如何诊断失败的 Azure 容器应用程序修订版?

azure - 一项流分析作业与多项作业

azure - 使用 Azure 流分析进行简单的数据传递

sql - 我可以在 Visual Studio Code for OS X 中创建 SQL 数据库吗?

sql - 创建 SQL 脚本以将旧数据库更改为当前数据库

c# - Azure AD 应用程序身份验证在没有委派/白名单权限的情况下成功验证了同一租户中的所有应用程序

azure-stream-analytics - ASA 中 LAG 功能的最大 LIMIT DURATION 是多少?