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
- Reduza as colunas de agrupamento, se possível - menos dimensões = consultas mais rápidas
- Filtre antes de agregar - use um nó Container anterior para filtrar as linhas primeiro
- 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):
- Adicione um nó Aggregate
- 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
Transformadores relacionados
- 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