Eu tenho o seguinte código:
drop table if exists statusCodes;
create table statusCodes (statusCode UInt16) engine=Memory;
insert into statusCodes values (0);
insert into statusCodes values (200);
insert into statusCodes values (200);
insert into statusCodes values (200);
insert into statusCodes values (200);
insert into statusCodes values (200);
insert into statusCodes values (201);
insert into statusCodes values (301);
insert into statusCodes values (301);
insert into statusCodes values (301);
insert into statusCodes values (301);
insert into statusCodes values (304);
insert into statusCodes values (404);
insert into statusCodes values (500);
select
multiIf(statusCode >= 500, '5xx', statusCode >= 400, '4xx', statusCode >= 300, '3xx', statusCode >= 200, '2xx', 'errored'),
groupArray(statusCode),
count(1) as count
from statusCodes
group by 1;
violino aqui: https://fiddle.clickhouse.com/b3b3dfb9-1826-47a8-b201-831498c941f2
Isso me dá
1 | 2 | 3 |
---|---|---|
4xx |
[404] |
1 |
3xx |
[301, 301, 301, 301, 304] |
5 |
2xx |
[200, 200, 200, 200, 200, 201] |
6 |
5xx |
[500] |
1 |
errored |
[0] |
1 |
Mas eu quero ter algo como
1 | 2 | 3 |
---|---|---|
2xx |
(200, 5), (201, 1) |
6 |
3xx |
(301, 3), (304, 1) |
5 |
4xx |
(404, 1) |
1 |
5xx |
(500, 1) |
1 |
errored |
(0, 1) |
1 |
Então, para resumir , quero agrupar todos os códigos de status por categoria principal (2xx, 3xx, 4xx, 5xx) e em linha, outro agrupamento por código de status real desta categoria.
Aqui está uma maneira de fazer isso usando duas agregações, a primeira por grupo de erros e código de erro, e a segunda apenas por erro:
Resultados :
Demonstração aqui