Todos os produtos
Search
Central de documentação

Simple Log Service:Cláusula GROUP BY

Última atualização: Sep 25, 2026

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

GROUP BY

Use para agrupar linhas por colunas listadas explicitamente. Esta é a forma padrão de agrupamento.

GROUP BY ALL

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 SELECT.

GROUP BY ROLLUP

Use quando precisar de um subtotal para cada grupo e de um total geral para todos os grupos.

GROUP BY CUBE

Use quando precisar de todas as combinações possíveis das colunas especificadas.

GROUP BY GROUPING SETS

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áusula GROUP BY aceita uma ou mais colunas.

  • aggregate_function: A função de agregação aplicada a cada grupo, como count, min, max, avg ou sum.

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:

  • key1 e key2: Campos ou expressões de agrupamento, como status, request_method, substr(request_method, 1, 1) ou uma expressão CASE. A expressão é agrupada pelo resultado calculado completo. O GROUP BY ALL nã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, como count(*), sum(request_time) ou avg(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 SELECT atual, 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 ALL com SELECT *, SELECT table_alias.* ou SELECT *, 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 do GROUP BY. Em SELECT request_method, status, count(*) AS PV GROUP BY ALL, tanto request_method quanto status são chaves de agrupamento.

  • Se a lista SELECT contiver 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 ALL equivale a omitir o GROUP BY ALL.

  • Você pode usar GROUP BY ALL com WHERE, HAVING, ORDER BY e 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 ALL isoladamente. Em GROUP BY ALL status ou GROUP BY ALL ROLLUP (...), o ALL modifica 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 em GROUP BY "all". Por padrão, um GROUP BY ALL isolado deriva as chaves de agrupamento automaticamente, mesmo que exista um campo chamado all.

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áusula GROUP BY aceita agrupamento por uma ou várias colunas.

  • aggregate_function: As Funções de agregação aplicadas a cada grupo, como count, min, max, avg ou sum.

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áusula GROUP BY aceita agrupamento por uma ou várias colunas.

  • aggregate_function: As Funções de agregação aplicadas a cada grupo, como count, min, max, avg ou sum.

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áusula GROUP BY aceita agrupamento por uma ou várias colunas.

  • aggregate_function: As Funções de agregação aplicadas a cada grupo, como count, min, max, avg ou sum.

Exemplos

Importante

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 ALL deriva automaticamente como chaves de agrupamento a partir da lista SELECT.

  • Resultados de cálculos de agregação em colunas, como COUNT() ou SUM().

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 por status, 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_method ou status indica 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 null indica que a coluna foi agregada. Por exemplo, GET / null / 189 indica que o PV total para o método GET em todos os códigos de status é 189, e null / null / 285 indica 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, e rank() classifica os resultados agregados sem participar do agrupamento. Códigos de status com a mesma contagem de solicitações possuem a mesma classificação.