Pular para o conteúdo principal

AggregateTransformer

Visão geral​

Converte nós Aggregate do Tableau em instruções SQL GROUP BY com funções de agregação. Agrupa linhas pelas colunas especificadas e aplica cálculos agregados (SUM, AVG, COUNT, MIN, MAX, COUNTD).

Tipo de nó: .v1.Aggregate / .v2018_2_3.SuperAggregate Saída: SQL SELECT com GROUP BY

Recursos​

  • Agrupamento por uma ou mais colunas
  • Funções de agregação: SUM, AVG, COUNT, MIN, MAX, COUNTD
  • Múltiplas agregações em diferentes colunas
  • Renomeação de colunas nas agregações
  • Tratamento de grandes conjuntos de agrupamento (mais de 10 colunas)

Exemplo de nó Tableau​

Exemplo 1: somar vendas por região e data​

Entrada (formato Tableau)​

{
"id": "40f4a735-e0f1-440b-a3d3-e2f3d85b8b2d",
"name": "Aggregate Sales",
"node_type": ".v2018_2_3.SuperAggregate",
"base_type": "superNode",
"actionNode": {
"nodeType": ".v1.Aggregate",
"groupByFields": [
{
"function": "GroupBy",
"columnName": "Year",
"newColumnName": null
},
{
"function": "GroupBy",
"columnName": "Month",
"newColumnName": null
},
{
"function": "GroupBy",
"columnName": "Region",
"newColumnName": null
},
{
"function": "GroupBy",
"columnName": "Division",
"newColumnName": null
},
{
"function": "GroupBy",
"columnName": "Customer Name",
"newColumnName": null
},
{
"function": "GroupBy",
"columnName": "Product Code",
"newColumnName": null
}
],
"aggregateFields": [
{
"function": "SUM",
"columnName": "Sales Amount",
"newColumnName": null
}
]
}
}

Esquema de entrada​

[
{"name": "year", "type": "integer"},
{"name": "month", "type": "integer"},
{"name": "region", "type": "string"},
{"name": "division", "type": "string"},
{"name": "customer_name", "type": "string"},
{"name": "product_code", "type": "string"},
{"name": "sales_amount", "type": "real"},
{"name": "invoice_date", "type": "date"},
{"name": "units", "type": "integer"}
]

SQL gerado​

SELECT
year,
month,
region,
division,
customer_name,
product_code,
SUM(sales_amount) AS sales_amount
FROM sales_data_V0S8
GROUP BY year, month, region, division, customer_name, product_code

Esquema de saída​

{
"year": "integer",
"month": "integer",
"region": "string",
"division": "string",
"customer_name": "string",
"product_code": "string",
"sales_amount": "real"
}

Exemplo 2: múltiplas agregações​

Entrada (formato Tableau)​

{
"id": "5a6b7c8d-9e0f-1a2b-3c4d-5e6f7a8b9c0d",
"name": "Product Statistics",
"node_type": ".v1.Aggregate",
"actionNode": {
"groupByFields": [
{
"function": "GroupBy",
"columnName": "Product Category",
"newColumnName": null
},
{
"function": "GroupBy",
"columnName": "Region",
"newColumnName": null
}
],
"aggregateFields": [
{
"function": "SUM",
"columnName": "Sales Amount",
"newColumnName": "Total Sales"
},
{
"function": "AVG",
"columnName": "Unit Price",
"newColumnName": "Average Price"
},
{
"function": "COUNT",
"columnName": "Order ID",
"newColumnName": "Order Count"
},
{
"function": "MAX",
"columnName": "Order Date",
"newColumnName": "Latest Order"
}
]
}
}

SQL gerado​

SELECT
product_category,
region,
SUM(sales_amount) AS total_sales,
AVG(unit_price) AS average_price,
COUNT(order_id) AS order_count,
MAX(order_date) AS latest_order
FROM orders_V0S12
GROUP BY product_category, region

Exemplo 3: contagem distinta (COUNTD)​

Entrada (formato Tableau)​

{
"id": "6b7c8d9e-0f1a-2b3c-4d5e-6f7a8b9c0d1e",
"name": "Customer Analytics",
"node_type": ".v1.Aggregate",
"actionNode": {
"groupByFields": [
{
"function": "GroupBy",
"columnName": "Region",
"newColumnName": null
},
{
"function": "GroupBy",
"columnName": "Year",
"newColumnName": null
}
],
"aggregateFields": [
{
"function": "COUNTD",
"columnName": "Customer ID",
"newColumnName": "Unique Customers"
},
{
"function": "SUM",
"columnName": "Revenue",
"newColumnName": "Total Revenue"
}
]
}
}

SQL gerado​

SELECT
region,
year,
COUNT(DISTINCT customer_id) AS unique_customers,
SUM(revenue) AS total_revenue
FROM transactions_V0S5
GROUP BY region, year

Exemplo 4: agregações MIN e MAX​

Entrada (formato Tableau)​

{
"id": "7c8d9e0f-1a2b-3c4d-5e6f-7a8b9c0d1e2f",
"name": "Price Range Analysis",
"node_type": ".v1.Aggregate",
"actionNode": {
"groupByFields": [
{
"function": "GroupBy",
"columnName": "Product Category",
"newColumnName": null
}
],
"aggregateFields": [
{
"function": "MIN",
"columnName": "Unit Price",
"newColumnName": "Min Price"
},
{
"function": "MAX",
"columnName": "Unit Price",
"newColumnName": "Max Price"
},
{
"function": "AVG",
"columnName": "Unit Price",
"newColumnName": "Avg Price"
}
]
}
}

SQL gerado​

SELECT
product_category,
MIN(unit_price) AS min_price,
MAX(unit_price) AS max_price,
AVG(unit_price) AS avg_price
FROM products_V0S3
GROUP BY product_category

Como funciona​

1. Identificar as colunas de agrupamento​

Extrai as colunas de groupByFields:

{
"groupByFields": [
{
"function": "GroupBy",
"columnName": "Region"
},
{
"function": "GroupBy",
"columnName": "Product Category"
}
]
}

2. Identificar as agregações​

Extrai as funções de agregação de aggregateFields:

{
"aggregateFields": [
{
"function": "SUM",
"columnName": "Sales Amount",
"newColumnName": "Total Sales"
}
]
}

3. Normalizar os nomes dos campos​

Converte nomes de campos em identificadores SQL:

"Sales Amount" → sales_amount
"Product Category" → product_category

4. Aplicar renomeações de colunas​

Usa newColumnName, se especificado:

{
"function": "SUM",
"columnName": "Sales Amount",
"newColumnName": "Total Sales" ← Rename
}

Gera:

SUM(sales_amount) AS total_sales

5. Gerar a instrução GROUP BY​

Cria SQL com a cláusula GROUP BY:

SELECT
<grouping_columns>,
<aggregate_functions>
FROM input_table
GROUP BY <grouping_columns>

Funções de agregação​

SUM - Soma total​

SUM(sales_amount) AS total_sales

Calcula a soma de todos os valores da coluna.

AVG - Média​

AVG(unit_price) AS average_price

Calcula a média de todos os valores da coluna.

COUNT - Contagem de linhas​

COUNT(order_id) AS order_count

Conta o número de valores não nulos da coluna.

COUNTD - Contagem distinta​

COUNT(DISTINCT customer_id) AS unique_customers

Conta o número de valores únicos (distintos) da coluna.

MIN - Valor mínimo​

MIN(unit_price) AS min_price

Encontra o menor valor da coluna.

MAX - Valor máximo​

MAX(order_date) AS latest_order

Encontra o maior valor da coluna.

Renomeação de colunas​

Sem renomeação (newColumnName = null)​

{
"function": "SUM",
"columnName": "Sales Amount",
"newColumnName": null
}

Usa o nome original da coluna:

SUM(sales_amount) AS sales_amount

Com renomeação (newColumnName especificado)​

{
"function": "SUM",
"columnName": "Sales Amount",
"newColumnName": "Total Sales"
}

Usa o novo nome:

SUM(sales_amount) AS total_sales

Grandes conjuntos de agrupamento​

O transformador Aggregate trata grandes quantidades de colunas de agrupamento de forma eficiente:

Exemplo com 15 colunas no GROUP BY:

SELECT
year, month, region, division, customer_name,
product_code, material_number, order_type,
sales_rep_name, sales_rep_number, city,
state, manager_name, manager_number, invoice_date,
SUM(sales_amount) AS sales_amount
FROM sales_V0S15
GROUP BY year, month, region, division, customer_name,
product_code, material_number, order_type,
sales_rep_name, sales_rep_number, city,
state, manager_name, manager_number, invoice_date

Sem agrupamento (agregar todas as linhas)​

Se groupByFields não for especificado, agrega todas as linhas:

{
"groupByFields": [],
"aggregateFields": [
{
"function": "SUM",
"columnName": "Sales Amount"
}
]
}

SQL gerado:

SELECT
SUM(sales_amount) AS sales_amount
FROM sales_V0S8

Nenhuma cláusula GROUP BY é adicionada (agrega a tabela inteira).

Suporte a anotações​

Nós Aggregate oferecem suporte a anotações anteriores/posteriores à ação para renomeações adicionais:

beforeActionAnnotations​

Renomeações aplicadas antes da agregação:

{
"before_action_annotations": [
{
"columnName": "Old Name",
"newColumnName": "New Name"
}
]
}

afterActionAnnotations​

Renomeações aplicadas após a agregação:

{
"after_action_annotations": [
{
"columnName": "sales_amount",
"newColumnName": "revenue"
}
]
}

Limitações​

  • ⚠️ Sem cláusula HAVING - A filtragem após a agregação deve ser feita com um nó Container posterior
  • ⚠️ Sem ROLLUP/CUBE - Conjuntos de agrupamento avançados não são suportados; use múltiplos nós Aggregate
  • ⚠️ Sem expressões personalizadas - As funções de agregação operam apenas em colunas individuais

Boas práticas​

Quando usar o transformador Aggregate​

  • ✅ Resumir dados por dimensões (região, produto, período)
  • ✅ Calcular totais (soma, contagem) entre grupos
  • ✅ Encontrar valores mínimos/máximos dentro de categorias
  • ✅ Contar valores distintos (clientes únicos, produtos etc.)

Otimização de agregações​

  1. Reduza as colunas de agrupamento, se possível - menos dimensões = consultas mais rápidas
  2. Filtre antes de agregar - use um nó Container anterior para filtrar as linhas primeiro
  3. Use agregações adequadas - COUNTD é mais lento que COUNT; use apenas quando necessário

Filtragem após a agregação​

Para filtrar após a agregação (equivalente à cláusula HAVING):

  1. Adicione um nó Aggregate
  2. Adicione um nó Container posterior com FilterOperation
-- Example: Only regions with > 1000 total sales
SELECT * FROM (
SELECT region, SUM(sales) AS total_sales
FROM data
GROUP BY region
) WHERE total_sales > 1000
  • ContainerTransformer - Para filtrar linhas antes ou depois da agregação
  • UnionTransformer - Para combinar dados agregados de múltiplas origens
  • JoinTransformer - Para unir resultados agregados a tabelas de dimensão