Report Output Controls
Narrow, sort, and cap the rows a report delivers to its destination. No SQL. No changes to the underlying Data Mart. Each report carries its own output controls. OWOX applies them at query time.
Output controls work for both Data Mart reports in the web app and reports created from the OWOX Extension.
| Control | What it does |
|---|---|
| Filters | Drop rows from the final result after all JOINs |
| Slices | Narrow a joined Data Mart before the JOIN (blended reports only) |
| Sort | Order the result by one or more columns |
| Limit | Cap the total number of rows |
Where to Find Output Controls
Section titled “Where to Find Output Controls”- Open a Data Mart and go to the Destinations tab.
- Find the report row, click its three-dot menu, and select Edit report.
- In the edit panel, go to the Report Columns section.
- Click the Output controls button (sliders icon).
Each section — Filters, Slices, Sort, and Limit — expands independently.
Filters
Section titled “Filters”A filter runs against the final SELECT, after all joins complete. Use filters to drop rows from the delivered report — except when the filter names an aggregated column or a calculated field, which is compared after the grouping and therefore drops groups rather than rows. See Filtering by a calculated field.
Supported operators by column type
Section titled “Supported operators by column type”| Column type | Available operators |
|---|---|
| String | is, is not, is any of, is none of, contains, does not contain, starts with, ends with, is empty, is not empty, is null, is not null, matches regex, does not match regex |
| Number | =, ≠, is any of, is none of, >, <, ≥, ≤, between, is null, is not null |
| Date / DateTime / Timestamp | on, not on, is any of, is none of, after, before, on or after, on or before, between, relative, is null, is not null |
| Time | at, not at, is any of, is none of, after, before, at or after, at or before, between, is null, is not null |
| Boolean | is true, is false, is blank, is not blank |
Is blank / is not blank match by what a rendered cell shows: a string column is blank when it is NULL, an empty string, or whitespace-only; every other type is blank only when it is NULL. These replace the former is empty / is not empty / is null / is not null operators — rules saved with those keep working and keep their original labels, but new rules use the blank pair.
Is any of / is none of match a column against a list of values (SQL IN / NOT IN). Enter the values comma-separated — up to 500 per rule. Wrap a value in double quotes if it contains a comma — for example "Acme, Inc.". Use "" for a literal quote.
Relative date presets
Section titled “Relative date presets”For date columns, the relative operator re-evaluates on every run:
- Today / Yesterday
- This week / Last week (ISO weeks — Monday through Sunday, on every storage type)
- This month / Last month / This quarter / Last quarter / This year
- Last N days / Last N months / Next N days (N from 1 to 3650)
Use it so rolling reports stay current without touching filter values manually. Like Last N days, Next N days includes today (today through N days ahead).
Add a filter
Section titled “Add a filter”- In the Filters section, click + Add Filter.
- Pick a column — search by display name, technical path, or Data Mart name.
- Select an operator.
- Enter a value (if the operator requires one).
- Click Apply.
Multiple filters use AND logic — every condition must match for a row to appear. OR logic between filters is not supported.
NULL values and negative operators. Negative operators include rows where the column is NULL — a missing value is treated as “not equal to X” rather than being dropped. This covers the “not equal” operator under every type label (is not, ≠ / not equals, not on, not at), is none of, does not contain, and does not match regex. The same applies to slices. To also remove missing values, add a separate filter on the same column (is not blank) — for a joined column this must be a filter, not a slice, because a slice runs before the join and cannot drop rows that arrive with NULL from an unmatched join.
To edit an existing filter, click the pencil icon on its row. To remove one, click the ×.
Slices
Section titled “Slices”Slices are pre-join filters. They narrow a joined Data Mart’s rows inside its own subquery, before the main query joins it in. This trims the joined data without affecting the source row count.
Slices are only available when a report includes columns from at least one joined Data Mart. See Joinable Data Marts to configure joins.
How slices differ from filters
Section titled “How slices differ from filters”The join between a source Data Mart and a joined Data Mart is a LEFT JOIN.
- A filter on a joined column acts on the fully-assembled result. It drops source rows with no matching joined value.
- A slice removes rows from the joined subquery before the join runs. Source rows with no match still pass through — with
NULLon the joined columns.
To also drop source rows with no match, add a filter on the same column (is not blank).
When to use slices
Section titled “When to use slices”Use slices to limit what you pull from a joined Data Mart. Example: fetch only records where status = Active from a CRM Data Mart. The source rows stay intact regardless.
Use filters to drop rows from the final result, regardless of join order — almost any column, the exception being an aggregated value computed from a joined Data Mart, which is refused by name.
Add a slice
Section titled “Add a slice”If you don’t see the Slices section, the report has no joined Data Marts. Join at least one first — see Joinable Data Marts.
- Expand the Slices section.
- Click + Add Slice.
- Pick a column — the picker groups joined columns under their Data Mart alias.
- Select an operator and enter a value.
- Click Apply.
Slices support the same operators as filters, matched to the column’s data type.
To edit an existing slice, click the pencil icon on its row. To remove one, click the ×.
Slices require an explicit column selection. Select at least one column in Report Columns — a report with no explicit selection rejects slices at save time.
Sort orders the rows in the delivered report. It runs on the final result, after filters and slices.
- Expand the Sort section.
- Click + Add Sort by.
- Choose a column and select Ascending or Descending.
- Add more rules to sort by multiple columns. Drag to reorder — the top rule wins.
To remove a sort rule, click the × on its row.
Sort runs before the row limit.
A report that does not aggregate can sort by any column of the Data Mart, selected or not — the same way a filter works. Once the report aggregates (an aggregation, a date bucket, a Unique Count, or a calculated field that aggregates), it can only sort by columns that are selected in Report Columns; sorting by an unselected column then fails validation, so adding an aggregation, a date bucket or a Unique Count to a report that sorts by an unselected column removes that sort rule. A calculated field is sortable only while it is selected. If you sort by a joined column, the report must have an explicit column selection — reports without one run as
SELECT *over native fields only.Unchecking a column removes the aggregation and date bucket set on it, a metric filter bound to that aggregation, and the sort rule on it when the report aggregates or the column is a calculated field. Row filters and slices stay: they apply whether or not the column is printed.
Limit caps the row count. It runs last — after filters, slices, and sort.
| Setting | Value |
|---|---|
| Default | No limit (all rows return) |
| Minimum | 1 |
| Maximum | 10,000,000 |
Enter a number in the Limit field to set a cap. Clear the field to return all rows.
When a limit shrinks the result, OWOX removes extra rows it wrote to the destination on the previous run. In Google Sheets, OWOX clears cells below the last data row so stale values don’t sit under fresh ones. See Google Sheets for details.
Order of Execution
Section titled “Order of Execution”OWOX applies output controls in this order on every report run:
- Slices — filter rows inside each joined subquery.
- Joins — join subqueries into the main query.
- Filters — filter the assembled result.
- Sort — order the remaining rows.
- Limit — cap the row count.
Array columns
Section titled “Array columns”Fields identified by an existing ARRAY schema type or BigQuery REPEATED mode are column-only. Filters, slices, sorts, aggregations (including COUNT and ANY_VALUE), and date buckets are unavailable. Blank checks are unavailable too. Joined arrays keep this restriction even though their output is JSON text.
Reports with stored array controls fail validation. Remove those controls using the existing settings, or recreate the report without them. Some previously accepted controls, such as COUNT, are now unavailable too. Ordinary nested scalar fields and opaque JSON, Snowflake VARIANT, and Redshift SUPER fields keep their existing behavior; their runtime contents are not inspected to classify arrays.
Keep Rules Valid After Schema Changes
Section titled “Keep Rules Valid After Schema Changes”Output controls reference columns by name. Rename or remove a column in the Data Mart schema, and every report that uses it breaks. The column picker flags the report with a Disconnected columns warning. Saving the report then fails with a validation error.
Disconnected columns warning
Section titled “Disconnected columns warning”Open Edit report. The column picker groups the missing columns under a red Disconnected columns label with a ⚠ icon. Hover the icon to see:
They are missing from the current Data Mart output schema. Uncheck them and remove any filter, sort, aggregation or date bucket rule that references them, or contact your analyst to restore the schema.
You have two options:
- Uncheck the disconnected columns — this removes them from the report selection together with the aggregation, date bucket, and sort rules set on them. Filter and slice rules that reference them stay: open the Filters and Slices sections, delete those rules too, then save.
- Restore the schema — does the column still belong? Ask whoever manages the Data Mart to add it back. Then reopen the report.
Hidden columns warning
Section titled “Hidden columns warning”Hiding a field from reporting is not the same event, and the picker says so. A report that already selected the field lists it under an amber Hidden columns label with an eye-off icon:
They are still in the Data Mart, but hidden from reporting. Uncheck them and remove any filter, sort, aggregation or date bucket rule that references them, or ask your analyst to show them in reports again.
Nothing is missing here and there is no schema to restore — someone decided the column should not be reported on. Any of the three switches leads here, and the fix is to reverse the one that was used:
- Hide from reports in a field’s ⋯ menu on the Data Mart’s Data Setup → Output Schema — the Data Mart’s own columns, calculated fields included.
- The same action on the joined Data Mart’s own Output Schema, which hides the field from its own reports and from every Data Mart that joins it.
- Hide from reports in the ⋯ menu of the join’s Report Fields tab (per-field overrides), which hides a joined field for this Data Mart’s reports only.
Uncheck the column to take it out of the report, or ask whoever hid it to show it again. Everything else behaves as above: the report cannot run until the column is out of it, and a filter, sort, aggregation or date bucket rule on it has to go too.
A report that carries one of each is told about both, and the advice to restore the schema stays — one of those columns really is gone.
Validation error on save
Section titled “Validation error on save”A filter, slice, sort, aggregation, or date bucket rule may still point to a column the report can no longer be built from. Save the report, and OWOX blocks it with an error that names the columns — Disconnected columns for the ones the schema lost, Hidden columns for the ones someone hid, and both when the report carries one of each. Open the report, remove the affected rules from the Filters, Slices, Sort, or Aggregations sections, then save again.
Only the delivery of a saved report degrades a sort on a disconnected column: a report run (scheduled or manual), a Looker Studio data pull, or a Google Sheets or Excel pull of the saved report drops the sort rule and continues, with a warning in the server log. The values of the rows do not change, only their order — unless the report also has a Limit: the limit is kept, so the rows that make the cut may then differ from the ones the sort used to pick (a former top 10 becomes an arbitrary 10). Saving the report, the Generated SQL preview, and ad-hoc queries from MCP or the HTTP Data API still report the column as disconnected. An aggregation or date bucket on a disconnected column fails the run with the same error, since it would change the values.
Other validation errors block the save with “Output controls validation failed” followed by the rules that failed and the columns they name.