带有 ORDER BY 的雪花 JSON 扁平化

Posted

技术标签:

【中文标题】带有 ORDER BY 的雪花 JSON 扁平化【英文标题】:Snowflake JSON FLATTEN with ORDER BY 【发布时间】:2021-03-31 14:43:47 【问题描述】:

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

我尝试将ROW_NUMBERORDER BY NULLORDER 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

【问题讨论】:

【参考方案1】:

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"

【讨论】:

这是巨大的!我现在看到它在文档中,但是并没有很好的示例(易于阅读)来展示 INDEX 值。谢谢! @abailey7 很高兴听到我能提供帮助。How does accepting an answer work? 我会接受,但你回答得这么快,我还要等;)

以上是关于带有 ORDER BY 的雪花 JSON 扁平化的主要内容,如果未能解决你的问题,请参考以下文章

在带有 ORDER BY 的子选择中使用 JSON_ARRAYAGG 会出错

有没有啥方法可以在雪花中使用 UDF 而不是扁平化?

json 查找ORDER BY,LIMIT

django rest 框架,order_by 来自 serializers.py 文件的 JSON

外部表的雪花外部阶段文件推荐

带有order_by的Django查询,对Postgresql的不同和限制