在 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 子句
ClickHouse 实时数据去重查询argMax +group by