A cláusula GROUP BY é geralmente usada com funções de agregação para agrupar as linhas do resultado de uma consulta. Cada grupo baseia-se nos valores de uma ou mais colunas, e cada combinação distinta de valores produz uma linha de resumo. A cláusula GROUP BY ALL deriva as chaves de agrupamento da lista SELECT automaticamente, enquanto as cláusulas ROLLUP, CUBE e GROUPING SETS estendem o GROUP BY para padrões de agrupamento adicionais.
Sintaxe
O Simple Log Service oferece suporte às seguintes formas de agrupamento. Escolha a forma mais adequada com base nas chaves de agrupamento e nos subtotais necessários para a sua consulta.
|
Cláusula |
Quando usar |
|
|
Use para agrupar linhas por colunas listadas explicitamente. Esta é a forma padrão de agrupamento. |
|
|
Use quando houver muitos campos de agrupamento, quando as dimensões de análise mudarem com frequência ou quando você quiser derivar as chaves de agrupamento da lista |
|
|
Use quando precisar de um subtotal para cada grupo e de um total geral para todos os grupos. |
|
|
Use quando precisar de todas as combinações possíveis das colunas especificadas. |
|
|
Use quando precisar apenas dos agrupamentos especificados. |
Em todas as formas de agrupamento, a lista SELECT pode conter apenas chaves de agrupamento e resultados agregados. Para a regra completa e uma consulta corrigida, consulte a nota em Exemplos.
GROUP BY
Agrupa os resultados da análise por uma ou mais colunas especificadas. Para ver exemplos, consulte os Exemplos 1, 2 e 3.
SELECT
key1,
...,
aggregate_function
GROUP BY
key1, ...
Parâmetros:
key1: A coluna usada para agrupar as linhas. Você pode agrupar as linhas por nomes de campos de log ou por colunas de resultado calculadas por funções de agregação. A cláusulaGROUP BYaceita uma ou mais colunas.aggregate_function: A função de agregação aplicada a cada grupo, comocount,min,max,avgousum.
GROUP BY ALL
O GROUP BY ALL usa automaticamente como chaves de agrupamento as expressões da lista SELECT que não contêm funções de agregação nem de janela. Assim, você não precisa repetir essas expressões na cláusula GROUP BY. Essa forma é útil quando há muitos campos de agrupamento ou quando você ajusta as dimensões de análise com frequência. Para ver exemplos, consulte os Exemplos 7, 8 e 9.
SELECT
key1,
key2,
aggregate_function
GROUP BY ALL
Parâmetros:
key1ekey2: Campos ou expressões de agrupamento, comostatus,request_method,substr(request_method, 1, 1)ou uma expressãoCASE. A expressão é agrupada pelo resultado calculado completo. OGROUP BY ALLnão aceita uma lista de campos; portanto, não repita um alias ou uma expressão após ele.aggregate_function: A função de agregação aplicada a cada grupo, comocount(*),sum(request_time)ouavg(request_time).
Por exemplo, as duas instruções de consulta a seguir são equivalentes:
* | SELECT request_method, status, count(*) AS PV GROUP BY ALL
* | SELECT request_method, status, count(*) AS PV GROUP BY request_method, status
Regras e limites:
O agrupamento automático baseia-se na lista
SELECTatual, e não em todos os campos dos logs. Adicione ou exclua uma expressão que não seja de agregação nem de janela; isso altera as dimensões de agrupamento de forma correspondente.Não há suporte para seleção com curinga no mesmo nível de consulta: você não pode combinar
GROUP BY ALLcomSELECT *,SELECT table_alias.*ouSELECT *, count(*). Liste os campos explicitamente. Essa limitação aplica-se à seleção com curinga em si, e não às funções de agregação. Portanto,count(*)funciona normalmente ao lado de campos listados explicitamente.Uma expressão completa que contenha uma função de agregação ou de janela não é adicionada automaticamente como chave de agrupamento. Por exemplo,
sum(request_time) / count(*)não é usada para agrupamento, e os campos dentro das chamadas de agregação não se tornam chaves de agrupamento. Qualquer campo não agregado que você selecione junto com essa expressão ainda deve obedecer às regras padrão de agrupamento doGROUP BY. EmSELECT request_method, status, count(*) AS PV GROUP BY ALL, tantorequest_methodquantostatussão chaves de agrupamento.Se a lista
SELECTcontiver apenas expressões de agregação, todos os dados que atendem às condições da consulta são agregados globalmente. Por exemplo,* | SELECT count(*) AS PV, sum(request_time) AS total_time GROUP BY ALLequivale a omitir oGROUP BY ALL.Você pode usar
GROUP BY ALLcomWHERE,HAVING,ORDER BYe funções de janela. As funções de janela operam nos resultados agrupados e agregados, e os campos referenciados por elas ainda devem obedecer às regras de agrupamento.Para derivar chaves de agrupamento automaticamente, use
GROUP BY ALLisoladamente. EmGROUP BY ALL statusouGROUP BY ALL ROLLUP (...), oALLmodifica a especificação de agrupamento que o segue, portanto, nenhuma chave de agrupamento é derivada automaticamente.Para agrupar por um campo ou alias chamado
all, coloque o nome entre aspas duplas, como emGROUP BY "all". Por padrão, umGROUP BY ALLisolado deriva as chaves de agrupamento automaticamente, mesmo que exista um campo chamadoall.
GROUP BY ROLLUP
A cláusula GROUP BY ROLLUP agrupa dados em resumos hierárquicos. Ela retorna um subtotal para cada grupo e um total geral para todos os grupos. Por exemplo, GROUP BY ROLLUP (a, b) produz um conjunto de resultados para os conjuntos de agrupamento (a, b), (a, null) e (null, null). Um valor null em um conjunto de agrupamento significa que a coluna é agregada nesse conjunto, portanto, a linha é um subtotal. Para ver um exemplo, consulte o Exemplo 6.
SELECT
key1,
...,
aggregate_function
GROUP BY ROLLUP (key1, ...)
Parâmetros
key1: A coluna que você defina para agrupar as linhas. Você pode agrupar por nomes de campos de log ou pelas colunas de resultado de uma função de agregação. A cláusulaGROUP BYaceita agrupamento por uma ou várias colunas.aggregate_function: As Funções de agregação aplicadas a cada grupo, comocount,min,max,avgousum.
GROUP BY CUBE
A cláusula GROUP BY CUBE agrupa dados por todas as combinações possíveis das colunas especificadas. Por exemplo, GROUP BY CUBE (a, b) produz um conjunto de resultados para os conjuntos de agrupamento (a, b), (null, b), (a, null) e (null, null). Um valor null em um conjunto de agrupamento significa que a coluna é agregada nesse conjunto, portanto, a linha é um subtotal. Para ver um exemplo, consulte o Exemplo 5.
SELECT
key1,
...,
aggregate_function
GROUP BY CUBE (key1, ...)
Parâmetros
key1: A coluna usada para agrupar as linhas. Você pode agrupar por nomes de campos de log ou pelas colunas de resultado de uma função de agregação. A cláusulaGROUP BYaceita agrupamento por uma ou várias colunas.aggregate_function: As Funções de agregação aplicadas a cada grupo, comocount,min,max,avgousum.
GROUP BY GROUPING SETS
A cláusula GROUP BY GROUPING SETS permite que você especifique vários agrupamentos distintos em uma única consulta. Por exemplo, GROUP BY GROUPING SETS (a, b) equivale a combinar os resultados de GROUP BY a e GROUP BY b, e produz um conjunto de resultados para os conjuntos de agrupamento (a, null) e (null, b). Uma coluna que não faz parte de um conjunto de agrupamento é nula nas linhas desse conjunto. Para ver um exemplo, consulte o Exemplo 4.
SELECT
key1,
...,
aggregate_function
GROUP BY GROUPING SETS (key1, ...)
Parâmetros
key1: A coluna usada para agrupar as linhas. Você pode agrupar por nomes de campos de log ou pelas colunas de resultado de uma função de agregação. A cláusulaGROUP BYaceita agrupamento por uma ou várias colunas.aggregate_function: As Funções de agregação aplicadas a cada grupo, comocount,min,max,avgousum.
Exemplos
Em uma instrução SQL, a lista SELECT de uma consulta de agrupamento pode conter apenas os seguintes itens:
Colunas ou expressões especificadas na cláusula
GROUP BY.Colunas ou expressões que o
GROUP BY ALLderiva automaticamente como chaves de agrupamento a partir da listaSELECT.Resultados de cálculos de agregação em colunas, como
COUNT()ouSUM().
Você também pode usar funções de janela em resultados agrupados. Para mais informações, consulte o Exemplo 9.
Não selecione diretamente uma coluna que não esteja incluída na cláusula GROUP BY, pois a coluna pode ter vários valores após o agrupamento e seu significado seria ambíguo. Por exemplo, a instrução de consulta a seguir é inválida:
* | SELECT status, request_time, COUNT(*) AS PV GROUP BY status
A instrução de consulta é inválida porque o campo request_time não está incluído na cláusula GROUP BY nem é processado por uma função de agregação. Reescreva a instrução de consulta da seguinte forma:
* | SELECT status, arbitrary(request_time), COUNT(*) AS PV GROUP BY status
Aqui, arbitrary(request_time) é uma operação de agregação em request_time que seleciona um valor arbitrário de request_time em cada grupo. Isso permite que você inclua a coluna na sua consulta.
Exemplo 1: Calcular as visualizações de página (PV) para cada código de status
Calcule os PV para cada código de status usando GROUP BY.
Instrução de consulta
* | SELECT status, count(*) AS PV GROUP BY status
Resultados da consulta: Uma tabela com as colunas status e PV, que mostra cada código de status HTTP e seu respectivo PV.
Exemplo 2: Calcular os PV por hora para um site
Calcule os PV para um site com granularidade horária usando GROUP BY.
Instrução de consulta
O campo __time__ é um campo reservado no Simple Log Service que representa a coluna de tempo. Nesta consulta, time é um alias para date_trunc('hour', __time__). Para mais informações sobre a função date_trunc, consulte função date_trunc.
* |
SELECT
count(*) AS PV,
date_trunc('hour', __time__) AS time
GROUP BY
time
ORDER BY
time
LIMIT
1000
Resultados da consulta: A consulta retorna um conjunto de resultados com as colunas PV e time. Nos dados de amostra, os valores de PV 1202, 10159 e 28001 correspondem a 2021-08-10 00:00:00.000, 2021-08-10 01:00:00.000 e 2021-08-10 02:00:00.000, respectivamente.
Exemplo 3: Calcular PV com granularidade de tempo de 5 minutos
Calcule os PV com granularidade de tempo de 5 minutos usando GROUP BY.
Instrução de consulta
A função date_trunc só pode agrupar dados por um intervalo fixo. Para agrupar dados por um intervalo de tempo personalizado, use a operação de módulo. Por exemplo, % 300 alinha as marcas de tempo a uma granularidade de tempo de 5 minutos (300 segundos).
* |
SELECT
count(*) AS PV,
__time__-__time__ % 300 AS time
GROUP BY
time
LIMIT
1000
Resultados da consulta: A consulta retorna três registros: PV=143 para time=1628525100, PV=31 para time=1628526600 e PV=44 para time=1628526900.
Exemplo 4: Agrupar por método de solicitação e status independentemente (GROUPING SETS)
Agrupe os dados por método de solicitação e por status de forma independente e calcule os PV para cada método de solicitação e para cada código de status.
Instrução de consulta
* |
SELECT
request_method,
status,
count(*) AS PV
GROUP BY
GROUPING SETS (request_method, status)
Resultados da consulta: Quando os dados são agrupados por
request_method,statusé nulo, e o PV é 189 para GET, 47 para POST, 39 para PUT, 9 para DELETE e 1 para HEAD. Quando os dados são agrupados porstatus,request_methodé nulo, e o PV é, por exemplo, 259 para 200, 2 para 201 e 2 para 202.
Exemplo 5: Agrupar por todas as combinações de método de solicitação e status (CUBE)
Agrupe os dados por método de solicitação e status da solicitação. Os conjuntos de agrupamento incluem (null, null), (request_method, null), (null, status) e (request_method, status). Calcule os PV para cada conjunto de agrupamento.
Instrução de consulta
* |
SELECT
request_method,
status,
count(*) AS PV
GROUP BY
CUBE (request_method, status)
Resultados da consulta: O conjunto de resultados contém as colunas request_method, status e PV e possui 43 registros. Nas linhas de agregação geradas pelo CUBE, um valor nulo para
request_methodoustatusindica um subtotal para essa dimensão. Por exemplo, o PV é 285 para null/null (o total geral), 189 para GET/null, 47 para POST/null, 39 para PUT/null, 9 para DELETE/null e 1 para HEAD/null. O PV é 259 para null/200, e 2 para cada um de null/201 e null/202.
Exemplo 6: Gerar subtotais hierárquicos para método de solicitação e status (ROLLUP)
Agrupe os dados por método de solicitação e status da solicitação. Os conjuntos de agrupamento incluem (request_method, status), (request_method, null) e (null, null). Calcule os PV para cada conjunto de agrupamento.
Instrução de consulta
* |
SELECT
request_method,
status,
count(*) AS PV
GROUP BY
ROLLUP (request_method, status)
Resultados da consulta: O conjunto de resultados contém as colunas request_method, status e PV e possui 33 registros. A função ROLLUP gera linhas de resumo em cada nível de agrupamento, onde
nullindica que a coluna foi agregada. Por exemplo,GET / null / 189indica que o PV total para o método GET em todos os códigos de status é 189, enull / null / 285indica que o PV total para todos os métodos e códigos de status é 285.
Exemplo 7: Agrupar automaticamente por vários campos (GROUP BY ALL)
Calcule os PV por método de solicitação e código de status, e mantenha apenas os grupos com mais de 100 solicitações.
Instrução de consulta
* |
SELECT
request_method,
status,
count(*) AS PV
GROUP BY ALL
HAVING count(*) > 100
ORDER BY PV DESC
Resultados da consulta: O conjunto de resultados contém as colunas request_method, status e PV. Apenas as combinações com mais de 100 solicitações são retornadas, classificadas por PV em ordem decrescente. Esse agrupamento equivale a
GROUP BY request_method, status.
Exemplo 8: Agrupar automaticamente por uma expressão (GROUP BY ALL)
Calcule os PV por método de solicitação com granularidade de tempo de 5 minutos sem repetir a expressão de tempo ou seu alias.
Instrução de consulta
* |
SELECT
__time__ - __time__ % 300 AS time,
request_method,
count(*) AS PV
GROUP BY ALL
ORDER BY time, request_method
LIMIT 1000
Resultados da consulta: O conjunto de resultados contém as colunas time, request_method e PV. Esse agrupamento equivale a
GROUP BY __time__ - __time__ % 300, request_method.
Exemplo 9: Classificar resultados agrupados (GROUP BY ALL)
Calcule os PV para cada código de status e, em seguida, classifique os códigos de status por contagem de solicitações em ordem decrescente.
Instrução de consulta
* |
SELECT
status,
count(*) AS PV,
rank() OVER (ORDER BY count(*) DESC) AS ranking
GROUP BY ALL
ORDER BY ranking, status
Resultados da consulta: O conjunto de resultados contém as colunas status, PV e ranking. Apenas
statusé usado como chave de agrupamento.count(*)executa a agregação, erank()classifica os resultados agregados sem participar do agrupamento. Códigos de status com a mesma contagem de solicitações possuem a mesma classificação.