如何使用正则表达式对SQL中的service字段按mySvr_xx形式分组统计
解决方案
针对你的需求,你可以利用ClickHouse的字符串处理函数来实现按mySvr_1xx这类前缀分组统计,这里提供两种常用的实现方式,你可以根据实际场景选择:
方法一:正则表达式替换(推荐,灵活适配不同数字长度)
通过regexpReplace函数捕获service字段中mySvr_后的第一位数字,将后续数字替换为xx,生成统一的分组键:
SELECT toUnixTimestamp(toStartOfMinute(itime)) * 1000 as t, -- 把mySvr_101转成mySvr_1xx,mySvr_202转成mySvr_2xx regexpReplace(service, '_(\\d)\\d{2}$', '_$1xx') as service_group, sum(count) FROM myTable WHERE itime BETWEEN toDateTime(aaa) AND toDateTime(bbb) AND service like 'mySvr_%' GROUP BY service_group, t ORDER BY t
正则表达式说明:
_(\\d)\\d{2}$:匹配下划线后的三位数字,其中(\\d)是捕获组,提取第一位数字;\\d{2}匹配剩下两位数字;$确保匹配到字段末尾。_$1xx:用下划线+捕获到的第一位数字+xx替换匹配到的部分,最终生成mySvr_1xx这类分组名。
如果你的service字段数字部分长度不固定(比如存在mySvr_12或mySvr_1234),可以把正则调整为_(\\d).*$,这样不管后面有多少位数字,都会替换成xx,兼容性更强。
方法二:字符串分割拼接(直观易懂)
通过splitByChar分割service字段,提取数字部分的第一位,再拼接成目标分组名:
SELECT toUnixTimestamp(toStartOfMinute(itime)) * 1000 as t, concat('mySvr_', substring(splitByChar('_', service)[2], 1, 1), 'xx') as service_group, sum(count) FROM myTable WHERE itime BETWEEN toDateTime(aaa) AND toDateTime(bbb) AND service like 'mySvr_%' GROUP BY service_group, t ORDER BY t
逻辑说明:
splitByChar('_', service)[2]:把service按下划线分割,取第二部分(即数字字符串,比如101)。substring(..., 1, 1):提取数字字符串的第一位(比如1)。concat('mySvr_', ..., 'xx'):拼接成mySvr_1xx的形式作为分组键。
这两种方法都能实现你要的分组统计效果,你可以根据自己的习惯和数据特点选择使用。
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

