在 clickhouse 上使用类似 group_concat 的东西

Posted

技术标签:

【中文标题】在 clickhouse 上使用类似 group_concat 的东西【英文标题】:using something like group_concat on clickhouse 【发布时间】:2021-09-26 12:43:31 【问题描述】:

我正在尝试得到结果

types name
fruit banana, apple, guaba, strawberry

来自具有类似数据库的表

桌子:水果

types name
fruit banana
fruit apple
fruit guaba
fruit strawberry

我知道使用 mysql 我可以使用 group_concat 来获得我想要的结果

SELECT group_concat(name), types FROM fruits

我已经完成了我的研究,人们建议我在 clickhouse 中使用 groupArray 以获得类似的结果,但这不是我想要的。因为当我使用

SELECT groupArray(name), types FROM fruits GROUP BY types

它给了我结果

types name
fruit apple, banana, banana, strawberry,strawberry,strawberry, guaba,guaba,guaba,guaba

groupArray 的顺序搞混了,我似乎找不到修复顺序的答案:(

在 clickhouse 中有什么方法可以让我们按顺序获得一系列结果吗?为什么会有重复的结果?

我不能使用 groupUniqArray,因为有时我的结果应该是

香蕉、苹果、番石榴、草莓、草莓(如果 DB 中有两次草莓)

如何保留重复的数据而不使其按顺序相乘???

我有 input_time 和 key 的数据,所以我的表类似于
types name input_time key
fruit banana 01:01 01
fruit apple 01:02 01
fruit guaba 01:03 02
fruit strawberry 01:04 03
fruit strawberry 01:05 04

忘记了“类型”,我想按键获得数据库保存顺序(输入时间顺序)中分组名称的结果。我应该如何更改我的查询??

我试过了

SELECT groupArray(name), key FROM fruits GROUP BY key ORDER BY input_time

但它没有给我想要的结果..

【问题讨论】:

【参考方案1】:

在子查询中使用 order by。数组中的顺序与查询管道上一阶段的行顺序相同

select types, arrayCompact(groupArray(name))  names, length(names) len from(
   select types, name from fruit order by types, input_time)
group by types


┌─types─┬─names───────────────────────────────────┬─len─┐
│ fruit │ ['banana','apple','guaba','strawberry'] │   4 │
└───────┴─────────────────────────────────────────┴─────┘

https://clickhouse.com/docs/en/sql-reference/functions/array-functions/#arraycompact 从数组中删除连续的重复元素。结果值的顺序由源数组中的顺序决定。

【讨论】:

谢谢!这对我帮助很大!我想再问一个问题,如果可以的话,有什么函数可以用来计算数组的数量吗?我尝试了 countSubstrings() 函数,但不知何故它在我的 clickhouse 中未定义函数(可能是因为版本问题) 我问这个是因为我想计算 arrayCompact 中有多少鬃毛名称。我试图计算 , +1 的数量来获得数字,但你认为有没有更好的方法来计算数组中名称的数量? 我添加了`length(names)`

以上是关于在 clickhouse 上使用类似 group_concat 的东西的主要内容,如果未能解决你的问题,请参考以下文章

在 clickhouse 上类似 ON CONFLICT DO NOTHING

大数据ClickHouse进阶(十三):ClickHouse的GROUP BY 子句

win7上安装 clickhouse可以吗?

ClickHouse 实时数据去重查询argMax +group by

ClickHouse 到底有多快? 200亿行数据 count,group 的响应时间

clickhouse 在集群上增删改查