clickhouse数据库里聚合函数any的用法

文章目录

    • 需求场景
    • any相关函数
      • any函数
      • anyHeavy函数介绍
      • anyLast函数
    • 生产使用

需求场景

  • 进行分组聚合统计时,有几个字段也需要返回,但是不在聚合的需求里面。对于同一聚合条件的记录,这些字段的值,有可能会不同,但是这不重要,只要返回一个值就行
  • 具体场景是,我们记录前端设备实时上报的交通指标信息,做一些数据统计分析,为交通预测、方案生成优化服务。对于不同的天气情况(晴、雨、雪、雾等),交通情况是大不同的,路口信号机也需要不同的方案。我们记录天气时,调用实时接口,时间精确到15分钟,空间精确到行政区。一天的天气可能是有变化的,但是按照小时或天统计时,这种不同是可以忽略的,只要返回一个天气结果就可以接受
  • 但是根据SQL的语法要求,不在group by聚合条件里的字段,没法直接返回,如果是数值,可以根据通过avgsum等函数计算返回。对于字符串,就不太合适。

any相关函数

  • 都属于clickhouse聚合函数的一部分,SQL已有的聚合函数,clickhouse也都支持
  • clickhouse也有一些自有函数,any就是其一,具体可以去查看官方文档:clickhouse聚合函数

any函数

  • ClickHouseany函数,返回一个随机的元素。
  • 语法:any(column)column-字段名称
  • 选择第一个遇到的值。 查询可以以任何顺序执行,甚至每次都以不同的顺序执行,因此此函数的结果是不确定的。 要获得确定的结果,您可以使用 ‘min’ 或 ‘max’ 功能,而不是 ‘any’.
  • 在某些情况下,可以依靠执行的顺序。 这适用于SELECT来自使用ORDER BY的子查询的情况。
  • 当一个 SELECT 查询具有 GROUP BY 子句或至少一个聚合函数,ClickHouse(相对于MySQL)要求在所有表达式 SELECT, HAVING,和 ORDER BY 子句可以从键或聚合函数计算
  • 换句话说,从表中选择的每个列必须在键或聚合函数内使用。 要获得像MySQL这样的行为,您可以将其他列放在 any 聚合函数

anyHeavy函数介绍

  • ClickHouseanyHeavy函数,返回一个频繁出现的元素。
  • 语法:anyHeavy(expression)column-字段名称
  • 选择一个频繁出现的值,使用heavy hitters 算法
  • 如果某个值在查询的每个执行线程中出现的情况超过一半,则返回此值
  • 通常情况下,结果是不确定的。
  • 查询实例 SELECT anyHeavy(AirlineID) AS res FROM ontime;

anyLast函数

  • ClickHouseanyLast函数,选择遇到的最后一个值
  • 语法:anyLast(expression)column-字段名称
  • 其结果和any 函数一样是不确定的

生产使用

  • 这里给出我们的一个简单示例,查询事件类型与数量,以及当时的天气情况
  • 业务要求,按照一天聚合时,返回天气字段时,只需要返回当天出现最频繁的天气即可
  • SQL如下:
  • 天气使用的anyHeavy,返回当天出现最多的;星期几使用的any;节假日使用的anyLast。后两个其实也可以放入聚合条件,但我怕聚合字段太多影响查询效率,没放进去,为了示例,特意使用了anyanyLast
SELECT
	toStartOfInterval(time_stamp , INTERVAL 1 day) as time_stamp2 ,
	sum(case when event_code in ('CONGESTION', 'SEVERE_CONGESTION', 'MILD_CONGESTION') then 1 else 0 end) as congestionCount,
	sum(case when event_code = 'REVERSE_DRIVE' then 1 else 0 end) as reverseDriveCount,
	sum(case when event_code = 'PEDESTRIAN_DETENTION' then 1 else 0 end) as detainCount,
	sum(case when event_code = 'OVERFLOW' then 1 else 0 end) as overflowCount,
	sum(case when event_code = 'LOCKED' then 1 else 0 end) as lockedCount,
	anyHeavy(weather) as weather,
	any(week_type) as weekType,
	anyLast(date_type) as dateType
FROM
	traffic_event
where
	1 = 1
	and time_stamp < '2023-05-17 11:15:28'
	and date_type = 'WEEKDAY'
GROUP BY
	time_stamp2
order by
	time_stamp2
limit 0 ,15

你可能感兴趣的:(ClickHouse,大数据开发,数据库及存储技术,clickhouse,数据库,聚合函数)