【问题标题】:Querying list in a Snowflake VARIANT file查询 Snowflake VARIANT 文件中的列表
【发布时间】:2021-12-08 05:56:30
【问题描述】:

我有一个包含许多 JSON 文件的 VARIANT 表,但为了示例和说明我的问题,我们只看下面的两行。

{ “id”:“1”, “领域”: [ { “id”:“somekey1”, “价值”:“价值1” }, { “id”:“somekey2”, “价值”:“价值2” } ] }, { “身份证”:“2”, “领域”: [ { “id”:“somekey1”, “价值”:“价值1” }, { “id”:“somekey2”, “价值”:“价值2” }, { “id”:“somekey3”, “价值”:“价值3” } ] }

我想写一个查询来给我这个输出:

ID VALUES
1 ["value1","value2","value3"]
2 ["value1","value2"]

我尝试了很多东西,这个查询给了我一些结果,但与期望的输出相差甚远:

 SELECT
      file:id as ID,
      s.value:value::varchar as VALUES
from variant_table,
      table(flatten(FILE:fields)) s

结果如下,如果fields为空,则省略JSON:

ID VALUES
1 "value1"
1 "value2"
1 "value3"
2 "value1"
2 "value2"

在 Snowflake 中解决此问题的最佳方法是什么?

【问题讨论】:

  • 在示例中,数组中的两个对象是在表中的单行中,还是在两个不同的行中?
  • 对不起,是的,它是两个单独的行
  • 我认为你只需要添加一个 listaggarray_agg 函数来在你扁平化它们之后聚合你的结果。
  • 嗨,迈克,谢谢,它适用于添加 OUTER => TRUE 参数。但是我现在遇到了一个新问题,我将编辑我的问题以显示它。

标签: snowflake-cloud-data-platform snowflake-schema


【解决方案1】:

展平后,这会将行转换为 VALUES 列的数组:

 SELECT
      file:id::int as ID,
      array_agg(s.value:value::varchar) as "VALUES"
from variant_table,
      table(flatten(FILE:fields)) s
group by ID

【讨论】:

  • 这是我的问题的解决方案。我想补充一点,如果实际上有没有价值的fields,将OUTER => TRUE 参数添加到flatten,可以防止省略这些行,并且如果有多个源需要在同一个查询中展平,将distinct 添加到array_agg 可防止创建重复项。
猜你喜欢
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
相关资源
最近更新 更多