I've a table with the columns: itime, service, count
.
I can write such a SQL to query some result:
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
It works as expected.
For the column service
, the contents always start with mySvr_
, such as mySvr_101
, mySvr_102
, mySvr_201
, mySvr_202
.
Now, I want to group by
the service
with some regular expression so that the result will be group by
like this: mySvr_1xx
, mySvr_2xx
, mySvr_3xx
etc.
But I don't know how. Could someone help me?
CodePudding user response:
We can use the case statements to specify the pattern to get desired output using GROUP BY and LIKE:
For the below table,
>>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)
the code is as follows:
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 stackOverflow
GROUP BY
CASE
WHEN service LIKE 'mySvr_1%' THEN '1st'
WHEN service LIKE 'mySvr_2%' THEN '2nd'
ELSE '3rd'
END;