【问题标题】:It is possible to create flat array from query results in clickhouse?可以从 clickhouse 中的查询结果创建平面数组吗?
【发布时间】:2020-10-29 19:28:53
【问题描述】:

查询

select *
from (
    select [1] a
    union all
    select [1,2] a
    union all
    select [2] a
) q;

结果(3 行)

[1]
[1,2]
[2]

预期结果(1 行)

[1,1,2,2]

有可能吗?

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    是的,当然。你只需要几个数组函数。

    select arrayFlatten(groupArray(*))
    from (
        select [1] a
        union all
        select [1,2] a
        union all
        select [2] a
    ) q;
    

    groupyArray 为您提供[[1],[1,2],[2]],基本上将所有结果分组到一个数组中。 arrayFlatten 将上述数组展平,得到[1,1,2,2]

    【讨论】:

      【解决方案2】:

      使用Array-combinator 的替代方式:

      SELECT groupArrayArray(*)
      FROM 
      (
          SELECT [1] AS a
          UNION ALL
          SELECT [1, 2] AS a
          UNION ALL
          SELECT [2] AS a
      ) AS q
      /* result
      ┌─groupArrayArray(a)─┐
      │ [1,1,2,2]          │
      └────────────────────┘
      */
      

      【讨论】:

      • 有趣。您是否知道与我的方法相比,这是否会产生更好的性能?
      • @MatthewFormosa 不确定,要知道它需要对大量数据进行测试或查看源代码。
      • 我刚刚测试过,有大的(大约 35M 数组)数据集,groupArrayArray 快 30%
      猜你喜欢
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 2018-12-20
      相关资源
      最近更新 更多