如何使用正则表达式选择分组
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_101
、mySvr_102
、mySvr_201
、mySvr_202
。
现在,我想用一些正则表达式 group by
和 service
,这样结果将是 group by
,如下所示:mySvr_1xx
、mySvr_2xx
、mySvr_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;
【讨论】:
以上是关于如何使用正则表达式选择分组的主要内容,如果未能解决你的问题,请参考以下文章