aggregate_rows
SQL GROUP BY and a spreadsheet pivot table for a list of JSON rows, in one call. Returns one output row per group with the aggregated columns, plus a summary: groups found, groups dropped by topN, values skipped because they were blank or not numeric (never guessed), and warnings such as a misspelled field name. Use it to turn scraped or API records into totals: orders and revenue per region, average price per brand, listings per city per month, top 10 products by revenue. Messy data is expected: "South" and "south " group together, and "$1,234.50" sums as 1234.5. Leave groupByFields empty to summarise all rows into one row. At most 500 rows per call.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | The records to aggregate, up to 500. Each row is a JSON object; keys may differ between rows. | |
| topN | No | After sorting, keep only the first N groups. The totals row still covers every input row. | |
| sortBy | No | An output column to sort by: a group field, an aggregation alias such as "total_amount", or a pivot column. Omitted sorts by the group fields. | |
| pivotField | No | Turns this field's distinct values into columns, pivot-table style: group by "region" and pivot on "product" for one row per region with a column per product. Must not also be a group-by field. At most 50 distinct values. | |
| aggregations | No | What to compute per group, for example [{"function":"count","alias":"orders"}, {"field":"amount","function":"sum","alias":"total_amount"}]. Every function except count needs a field. alias is the output column name (defaults to function_field, or "count"). Omitted gives a plain row count per group. Up to 20. | |
| groupByFields | No | One output row per distinct combination of these field values, like SQL GROUP BY, for example ["region"] or ["city", "category"]. Dot paths like "address.city" work. Empty or omitted aggregates every row into a single row. | |
| groupMatching | No | normalized (default) ignores letter case and extra whitespace when grouping, so "South" and "south " are one group. exact requires identical values. | |
| pivotFunction | No | How pivot cell values are combined. Defaults to sum when pivotValueField is set; ignored (row count) without one. | |
| sortDirection | No | asc (default) or desc. Use desc with topN for "top N by" questions. | |
| lenientNumbers | No | On by default: "$1,234.50", "49 USD", "12%" and "(300)" count as numbers for sum, avg, min, max and median. Set false to accept only real numbers and plain numeric strings. | |
| dateBucketField | No | A date or timestamp field to group by time period, for example "orderedAt". Adds a group column named like "orderedAt_month". Unreadable dates land in an "(invalid date)" group. | |
| pivotValueField | No | The field whose values fill the pivot cells, for example "amount". Omitted fills each cell with a row count. | |
| includeTotalsRow | No | Appends a grand-total row labelled "(total)" and adds a _rowType column ("group" or "total"). | |
| dateBucketGranularity | No | Bucket size for dateBucketField: day (2026-08-19), week (2026-W34), month (2026-08, default), quarter (2026-Q3) or year. |