【问题标题】:flatten snowflake arrays into rows将雪花阵列展平成行
【发布时间】:2021-11-06 18:53:24
【问题描述】:

我有一个带有 3 个数组的雪花表(包含在一个表行中):

顺序数组:

[
  1466369,
  1466369,
  1466369,
  1466369,
  1466369,
  1466369,
  1466369
]

部分数组

[
  17083,
  40052,
  173810,
  71874,
  104769,
  121607,
  47652
]

价格数组:

[
  9000.72,
  9920.5,
  11302.86,
  18458.7,
  26606.4,
  27686.2,
  36791.95
]

如何将数组转换为行,以便每行由 3 列组成,以便 第一 行由 3 列组成,由每个数组的第一个单元格组成,并且 second 行由 3 列组成 - 从每个数组的第二个单元格等......因此转换结果将是 7 个表格行(匹配每个数组中的 7 个单元格) .

flatten 关键字将数组单元格拆分为行,这让我无法理解。

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    使用计数表访问数组元素:

    数据:

    CREATE OR REPLACE TABLE t
    AS
    SELECT PARSE_JSON('[1466369, 1466369, 1466369, 1466369, 1466369, 1466369, 1466369]') AS orders,
    PARSE_JSON ('[17083, 40052, 173810, 71874, 104769, 121607,  47652]') AS part,
    PARSE_JSON ('[9000.72, 9920.5, 11302.86, 18458.7, 26606.4,  27686.2, 36791.95]') AS price;
    

    查询:

    SELECT  orders[s.t]::INT AS orders, part[s.t]::INT AS part, price[s.t] AS price
    FROM t
    LEFT JOIN (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS s(t)
      ON s.t < GREATEST(ARRAY_SIZE(t.orders), ARRAY_SIZE(t.part), ARRAY_SIZE(t.price));
    

    输出:


    或者:

    SELECT  s1.index, s1.value, s2.value, s3.value
    FROM t
    ,TABLE(FLATTEN(t.orders)) s1
    ,TABLE(FLATTEN(t.part)) s2
    ,TABLE(FLATTEN(t.price)) s3
    WHERE s1.INDEX = s2.INDEX
      AND s2.INDEX = s3.INDEX;
    

    输出:

    虽然这种方法会爆炸得非常快 size_array_1 * size_array_2 * size_array_3。


    编辑:

    我尝试在其中一个数组值中放置一个 null(未定义)值,当我这样做时 - 查询不会返回具有 null 作为列值之一的行(返回 6 行而不是 7 ) .有没有办法解决这个问题

    CREATE OR REPLACE TABLE t
    AS
    SELECT PARSE_JSON('[1466369, null, 1466369, 1466369, 1466369, 1466369, 1466369]') AS orders,
    PARSE_JSON ('[17083, 40052, 173810, 71874, 104769, 121607,  47652]') AS part,
    PARSE_JSON ('[9000.72, 9920.5, 11302.86, 18458.7, 26606.4,  27686.2,36791.95]') AS price;
    

    查询:

    SELECT  s1.index, s1.value, s2.value, s3.value
    FROM t
    ,TABLE(FLATTEN(t.orders, OUTER=> TRUE)) s1
    ,TABLE(FLATTEN(t.part, OUTER=> TRUE)) s2
    ,TABLE(FLATTEN(t.price, OUTER=> TRUE)) s3
    WHERE s1.INDEX = s2.INDEX
      AND s2.INDEX = s3.INDEX;
    

    输出:

    【讨论】:

    • 在最后一个查询中(在“alternatively...”之后)-当您在“FROM”部分引用 s1、s2、s3 时-“flatten”是否知道“orders”、“part”和 "price" 是表 t 中的列,还是缺少某些内容?
    • @Dror 有单个表 t 所以它不需要有表别名但你可以添加它。
    • 谢谢。我尝试在其中一个数组值中放置一个空值(未定义),当我这样做时 - 查询不会返回具有空值的行作为列值之一(返回 6 行而不是 7 行)。有办法解决这个问题吗?
    • @Dror 如果在FLATTEN 语句中添加OUTER =&gt; TRUE,它将保留NULL。
    • @MikeWalton 我在最后一个查询的所有 FLATTEN() 子句中放置了 'OUTER => TRUE',但最终还是只有 6 行而不是 7 行
    猜你喜欢
    • 2020-09-16
    • 2022-01-21
    • 2020-03-24
    • 2021-07-16
    • 2021-12-18
    • 2021-03-31
    • 2021-08-16
    • 2020-09-12
    • 2021-07-23
    相关资源
    最近更新 更多