当前位置: 首页 > news >正文

clickhouse自定义函数的困惑

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

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

CREATE function my_count as (str1 ,str2 ,str3 )-> (SELECT max(element)from( SELECTarrayJoin(array) AS element,count(*) AS countFROM (SELECT [str1,str2,str] AS array)where LENGTH(element)>0GROUP BY elementORDER BY count DESClimit 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值,就是需求目标

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


http://www.mrgr.cn/news/5977.html

相关文章:

  • 2024.8.23(docker)
  • Java二十三种设计模式-命令模式(18/23)
  • 将前端上传的文件同步到sftp服务器
  • 如何让ChatGPT说话更像人类
  • Linux中nano编辑器详解
  • ChaCha20:高效且安全的流密码算法
  • Excel 中找出每列第一个和最后一个非空格对应的行--Excel难题#87
  • 基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(三)---创建自定义激光雷达Componet组件
  • 同业、金融市场、投资银行业务系统应用架构设计
  • MySQL表的内外连接
  • 为IntelliJ IDEA安装插件
  • Milvus实践(4) ---- attu2.4x及以下版本可视化工具搭建(不stop milvus服务)
  • java 中的设计模式
  • 官方强烈建议更新,关键漏洞影响GitHub Enterprise Server 所有版本
  • 阿里云服务器的基本使用
  • 基于GPT-SoVITS的API实现批量克隆声音
  • C学习(数据结构)-->实现链式结构二叉树
  • springboot 上传文件失败:The temporary upload location
  • 【JavaEE初阶】三次握手与四次挥手
  • 操作系统中的锁:自旋锁、互斥锁、条件变量、信号量、死锁