clickhouse自定义函数的困惑

近期遇到一个困惑的问题,自定义函数中,如果出现查询语句,则传递的参数,不能传递字段名,只能传递常量或者表达式,文档中也没有找到对应的解决办法。

需求其实比较简单,查询的时候,要做一个"少数服从多数"的决定,在一行记录中,存在多个字段值是String类型,使用哪个字段值,取决于字段内容出现的频率次数最高的字符串,注意,这里是一行记录,可以理解成,一个数组字段类型,常规想法就是 select group by ,但是,就出现了开头说的问题,不能传递字段名称作为参数。

sql 复制代码
CREATE function my_count as (str1 ,str2 ,str3 )-> (
	SELECT max(element)
	from
	( 
	    SELECT
	    arrayJoin(array) AS element,
	    count(*) AS count
		FROM (
		    SELECT [str1,str2,str] AS array
		)
		where LENGTH(element)>0
		GROUP BY element
		ORDER BY count DESC
		limit 1
	) t	
)

上述代码,传递常量是没有问题的,但是:

select my_count(field1,field2,field3) as a from my_table

就会报错,提示不支持字段作为参数

后来,只能从文档的方法来入手,找内置的arry相关函数

CREATE FUNCTION my_test as (arr) ->arrayReverseSort((m,n)->n, arrayMap(x->(x,countEqual(arr,x)),arrayDistinct(arr)))

这里就很好解决了需求,不过,性能可能会低一点,起码先凑合着用着。

arrayDistinct 表示数组的元素取唯一,去重。

countEqual 表示计算元素在数组中出现的次数

arrayMap 把统计元素个数映射成 (key,count)的格式,其中count就是计数

arrayReverseSort 就是倒序,根据第2个参数(count)进行排序

在使用中 SELECT uniqTotal('a','b','b','a','a')1.1 AS ele

其中1表示取数组的第一个元素,.1表示取key值,就是需求目标

完美解决,如果有更好的办法,麻烦留言告知,谢谢!

相关推荐
java_logo17 小时前
Docker 部署 ClickHouse Server:轻松搭建列式 OLAP 分析数据库平台
数据库·clickhouse·docker·私有化部署·olap·列式数据库·轩辕镜像
西风未眠5 天前
ClickHouse数据库引擎引起的数据丢失
数据库·clickhouse·故障
李兆龙的博客7 天前
从一到无穷大 #86:ClickHouse 收购 RunReveal——可观测性竞争进入宏观调控阶段
clickhouse
Gain_chance11 天前
大数据毕业设计实战|Data Insight Platform:用 FastAPI + ClickHouse 打造低门槛全链路数据洞察平台
大数据·数据库·clickhouse·毕业设计·fastapi
迷迭香yy14 天前
A股数据本地存储方案对比JSON、SQLite、ClickHouse、DuckDB怎么选 IG50免费开源股票数据API接口
clickhouse·sqlite·json
leisoo809715 天前
本地股票数据深度对比ClickHouse与Parquet存储方案 IG50免费开源股票数据API接口
clickhouse·开源
A.说学逗唱的Coke17 天前
【数据库专题】ClickHouse 深度实战:从列式存储原理到 PB 级海量日志与可观测性分析
数据库·clickhouse·硬件架构
吉甫作诵23 天前
阿里云 ECS 安装 ClickHouse:密码配置、目录迁移与基础调优
大数据·clickhouse
NineData23 天前
NineData Oracle 到 ClickHouse 数据迁移完整流程:结构复制、全量装载、增量同步
数据库·clickhouse·oracle·数据迁移·ninedata·增量同步·数据迁移工具
DB哥讲数据库1 个月前
【ClickHouse安装教程】从零开始部署高性能列式数据库(附ClickHouse安装包)
数据库·clickhouse