如何使用正则表达式选择分组

Posted

技术标签:

【中文标题】如何使用正则表达式选择分组【英文标题】:How to select group by with Regex 【发布时间】:2021-12-21 22:25:01 【问题描述】:

我有一个包含列的表格:itime, service, count

我可以写这样一个SQL来查询一些结果:

SELECT
    toUnixTimestamp(toStartOfMinute(itime)) * 1000 as t,
    service,
    sum(count)
FROM myTable
WHERE
    -- aaa and bbb are two integers
    itime BETWEEN toDateTime(aaa) AND toDateTime(bbb)
    and service like 'mySvr_%'
GROUP BY
    service,
    t
ORDER BY t

它按预期工作。

对于service列,内容始终以mySvr_开头,如mySvr_101mySvr_102mySvr_201mySvr_202

现在,我想用一些正则表达式 group byservice,这样结果将是 group by,如下所示:mySvr_1xxmySvr_2xxmySvr_3xx 等。

但我不知道怎么做。有人可以帮我吗?

【问题讨论】:

正则表达式支持是产品特定的功能。你的 DBMS 是什么? @Serg 好吧,事实上我正在研究 Grafana,它可以从 ClickHouse 获取数据。我正在 Grafana 上编写一些 SQL 来可视化 ClickHouse 中的数据。 @Yves,你没有使用正则表达式。 Regex 代表正则表达式,您的查询仅包含要在 like 表达式中查找的模式。您确定 % 是您的 sql 引擎的正确字符吗? @RobertoHernandez 是的,我确定。 【参考方案1】:

我们可以使用 case 语句指定模式以使用 GROUP BY 和 LIKE 获得所需的输出:

对于下表,

    >>SELECT * FROM temp_table;
    +-------+------------+-------+
    | itime | service    | count |
    +-------+------------+-------+
    |     1 | mySvr_1234 |     2 |
    |     2 | mySvr_2123 |     3 |
    |     1 | mySvr_1233 |     4 |
    |     4 | mySvr_3212 |     3 |
    |     5 | mySvr_2317 |     2 |
    +-------+------------+-------+
    5 rows in set (0.00 sec)

代码如下:

    SELECT service,count(*),
     CASE
       WHEN service LIKE 'mySvr_1%' THEN '1st'
       WHEN service LIKE 'mySvr_2%' THEN '2nd'
       ELSE '3rd'
     END AS group_by_result
    FROM ***
    GROUP BY
     CASE
       WHEN service LIKE 'mySvr_1%' THEN '1st'
       WHEN service LIKE 'mySvr_2%' THEN '2nd'
       ELSE '3rd'
     END;

【讨论】:

以上是关于如何使用正则表达式选择分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中对多个正则表达式使用正则表达式“分组”?

如何用正则表达式匹配括号中的内容,不包含括号

python学习正则表达式进阶

如何用正则表达式匹配括号中的内容。

javaScript——正则表达式进阶练习

正则表达式非捕获分组与具名分组