首页 > 解决方案 > 带有 ORDER BY 的雪花 JSON 扁平化

问题描述

我有一个工作查询将嵌套的 JSON 对象展平为数据行。但是,我想做的是保留嵌套了几层的一组对象的原始顺序。

我曾尝试ROW_NUMBER与 anORDER BY NULL和 an一起使用ORDER BY (SELECT NULL),但似乎都没有保留顺序。

关于如何做到这一点的任何想法?下面的例子。我选择屏蔽真实数据,但结构的重要部分是相同的。JSON 格式的数据没有等级识别信息,但我在这里使用数字作为示例来显示奇怪的结果。

原始结构(屏蔽):

{
    "topNode: {
        "childNode": {
            "list": [
                {
                    "title": "example title 1",
                },
                {
                    "title": "example title 2",
                },
                {
                    "title": "example title 3",
                },
                {
                    "title": "example title 4",
                },
                {
                    "title": "example title 5",
                }
            ]
        }
    }
}

示例查询(屏蔽):

SELECT 
    A.VALUE:"title"::VARCHAR AS "TITLE",
    ROW_NUMBER() OVER(ORDER BY NULL) AS RANK
FROM 
    DB.SCHEMA.TABLE as A,
    lateral flatten(input=>A.JSON:topNode.childNode.list) "list_flatten"

示例输出:

TITLE                     RANK
"example title 3"         1
"example title 5"         2
"example title 2"         3
"example title 1"         4
"example title 4"         5

标签: sqljsonsnowflake-cloud-data-platformflatten

解决方案


可以使用INDEX,它返回数组中元素的索引:

SELECT A.VALUE:"title"::VARCHAR AS "TITLE",
       "list_flatten".index AS "RANK"
FROM DB.SCHEMA.TABLE as A,
lateral flatten(input=>A.JSON:topNode.childNode.list) "list_flatten"

推荐阅读