clickhouse-嵌套列中的分组依据

t1rydlwq  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(643)

如何在嵌套列中执行分组依据?
我有一个嵌套列items.productname和items.amount。
我要获取按productname的每个值分组的金额总和。
我可以通过数组连接来实现这一点

SELECT items.productName as name, sum(items.amount) as amt from test 
    array join items
    group by items.productName

但是数组连接很慢,所以我们不能使用它们。
因此,我尝试使用sumforeach(),但不确定如何按单个产品名对结果进行分组

SELECT items.productName as name, sumForEach(items.amount) as amt from test
    group by name

我可以不使用数组连接来实现这个功能吗?
谢谢。

nnsrf1az

nnsrf1az1#

也可以使用summap函数:

select result.1 as name, result.2 as amt
from (
      select sumMap(items.productName, items.amount) sum_per_keys,
            arrayJoin(arrayZip(sum_per_keys.1, sum_per_keys.2)) result
      from nested_columns_test)
order by name;

对ch20.3.8.53的测试表明summap比array join慢得多。
准备测试环境:

create table nested_columns_test(
  id Int32,
  items Nested(productName String, amount Int32)
) Engine = MergeTree()
order by (id);

insert into nested_columns_test
select number as id,
      arrayMap(x -> concat('product_', toString(x)), range(number % 32)) as `items.productName`, 
      arrayMap(x -> number + x, range(number % 32)) as `items.amount` 
from numbers(100*1000*1000);

SELECT items.productName as name, sum(items.amount) as amt 
from nested_columns_test 
array join items
group by items.productName
order by name;

相关问题