You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则表达式对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

逻辑说明:

  1. splitByChar('_', service)[2]:把service按下划线分割,取第二部分(即数字字符串,比如101)。
  2. substring(..., 1, 1):提取数字字符串的第一位(比如1)。
  3. concat('mySvr_', ..., 'xx'):拼接成mySvr_1xx的形式作为分组键。

这两种方法都能实现你要的分组统计效果,你可以根据自己的习惯和数据特点选择使用。

内容的提问来源于stack exchange,提问作者Yves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 01:58:14