专做国外商品的网站,广州海珠区最新通告,网络服务器无响应可能原因,龙岩网站设计培训文章目录 需求场景any相关函数any函数anyHeavy函数介绍anyLast函数 生产使用 需求场景
进行分组聚合统计时#xff0c;有几个字段也需要返回#xff0c;但是不在聚合的需求里面。对于同一聚合条件的记录#xff0c;这些字段的值#xff0c;有可能会不同#xff0c;但是这… 文章目录 需求场景any相关函数any函数anyHeavy函数介绍anyLast函数 生产使用 需求场景
进行分组聚合统计时有几个字段也需要返回但是不在聚合的需求里面。对于同一聚合条件的记录这些字段的值有可能会不同但是这不重要只要返回一个值就行具体场景是我们记录前端设备实时上报的交通指标信息做一些数据统计分析为交通预测、方案生成优化服务。对于不同的天气情况晴、雨、雪、雾等交通情况是大不同的路口信号机也需要不同的方案。我们记录天气时调用实时接口时间精确到15分钟空间精确到行政区。一天的天气可能是有变化的但是按照小时或天统计时这种不同是可以忽略的只要返回一个天气结果就可以接受但是根据SQL的语法要求不在group by聚合条件里的字段没法直接返回如果是数值可以根据通过avg、sum等函数计算返回。对于字符串就不太合适。
any相关函数
都属于clickhouse聚合函数的一部分SQL已有的聚合函数clickhouse也都支持clickhouse也有一些自有函数any就是其一具体可以去查看官方文档clickhouse聚合函数
any函数
ClickHouse的any函数返回一个随机的元素。语法any(column)column-字段名称选择第一个遇到的值。 查询可以以任何顺序执行甚至每次都以不同的顺序执行因此此函数的结果是不确定的。 要获得确定的结果您可以使用 ‘min’ 或 ‘max’ 功能而不是 ‘any’.在某些情况下可以依靠执行的顺序。 这适用于SELECT来自使用ORDER BY的子查询的情况。当一个 SELECT 查询具有 GROUP BY 子句或至少一个聚合函数ClickHouse相对于MySQL要求在所有表达式 SELECT, HAVING和 ORDER BY 子句可以从键或聚合函数计算换句话说从表中选择的每个列必须在键或聚合函数内使用。 要获得像MySQL这样的行为您可以将其他列放在 any 聚合函数
anyHeavy函数介绍
ClickHouse的anyHeavy函数返回一个频繁出现的元素。语法anyHeavy(expression)column-字段名称选择一个频繁出现的值使用heavy hitters 算法如果某个值在查询的每个执行线程中出现的情况超过一半则返回此值通常情况下结果是不确定的。查询实例 SELECT anyHeavy(AirlineID) AS res FROM ontime;
anyLast函数
ClickHouse的anyLast函数选择遇到的最后一个值语法anyLast(expression)column-字段名称其结果和any 函数一样是不确定的
生产使用
这里给出我们的一个简单示例查询事件类型与数量以及当时的天气情况业务要求按照一天聚合时返回天气字段时只需要返回当天出现最频繁的天气即可SQL如下天气使用的anyHeavy返回当天出现最多的星期几使用的any节假日使用的anyLast。后两个其实也可以放入聚合条件但我怕聚合字段太多影响查询效率没放进去为了示例特意使用了any和anyLast
SELECTtoStartOfInterval(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
FROMtraffic_event
where1 1and time_stamp 2023-05-17 11:15:28and date_type WEEKDAY
GROUP BYtime_stamp2
order bytime_stamp2
limit 0 ,15