代码之家  ›  专栏  ›  技术社区  ›  bukzor

重复字段的聚合唯一值

  •  0
  • bukzor  · 技术社区  · 7 年前

    我桌上有一个重复的字段。我想运行一个聚合查询并接收与我的查询匹配的唯一值数组。我尝试了此查询的几种变体:

    with t as (select * from unnest([
        STRUCT("foo" as name, ["red", "blue"] as color)
      , STRUCT("foo", ["blue"])
      , STRUCT("foo", NULL)
      , STRUCT("foo", ["green"])
      , STRUCT("bar", ["orange", "black"])
      , STRUCT("bar", ["black", "white"])
    ]))
    select
        (select color from unnest(array_concat_agg(color))) as color
    from t
    group by name
    

    期望的结果是:

    name  | color
    =====================================
    foo   | ["red", "blue", "green"]
    bar   | ["orange", "black", "white"]
    

    这个特殊的查询给出 Aggregate function ARRAY_CONCAT_AGG not allowed in UNNEST at [10:31] ,但我在文档中找不到这个错误,也找不到为什么会有这样的限制的直观原因,也找不到如何修复这个错误。

    我所做的工作是否本质上需要额外级别的嵌套查询?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Mikhail Berlyant    7 年前

    下面是BigQuery标准SQL

    #standardSQL
    SELECT name, ARRAY_AGG(DISTINCT color) color
    FROM `project.dataset.your_table`, UNNEST(color) color
    GROUP BY name
    

    你可以用问题中的虚拟数据来测试和玩上面的游戏

    #standardSQL
    WITH `project.dataset.your_table` AS (
      SELECT * FROM UNNEST([
        STRUCT("foo" AS name, ["red", "blue"] AS color)
      , STRUCT("foo", ["blue"])
      , STRUCT("foo", NULL)
      , STRUCT("foo", ["green"])
      , STRUCT("bar", ["orange", "black"])
      , STRUCT("bar", ["black", "white"])
    ]))
    SELECT name, ARRAY_AGG(DISTINCT color) color
    FROM `project.dataset.your_table`, UNNEST(color) color
    GROUP BY name
    

    结果是

    Row name    color    
    1   bar     orange   
                white    
                black    
    2   foo     red  
                blue     
                green    
    
        2
  •  0
  •   Gordon Linoff    7 年前

    这将得到您想要的结果:

    select t.name, array_agg(distinct color)
    from (select name, array_concat_agg( color) as colors
          from t
          group by name
         ) t cross join
         unnest(colors) color
    group by t.name;
    

    查询有几个问题,特别是 unnest() 将返回多行。