Skip to content

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.

ControlWhat it does
FiltersDrop rows from the final result after all JOINs
SlicesNarrow a joined Data Mart before the JOIN (blended reports only)
SortOrder the result by one or more columns
LimitCap the total number of rows

  1. Open a Data Mart and go to the Destinations tab.
  2. Find the report row, click its three-dot menu, and select Edit report.
  3. In the edit panel, go to the Report Columns section.
  4. Click the Output controls button (sliders icon).

Each section — Filters, Slices, Sort, and Limit — expands independently.

Data Mart Destinations tab with a Google Sheets report row. A three-dot context menu is open showing Run report, Edit report, and Delete report options. An arrow points to the menu button.

Edit report panel for a Google Sheets report. The Report Columns section (19/19) is expanded with Filters, Sort, and Limit sections visible — all empty. An arrow points to the Output controls button (sliders icon) in the top-right corner of the Report Columns section.


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.

Column typeAvailable operators
Stringis, 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 / Timestampon, not on, is any of, is none of, after, before, on or after, on or before, between, relative, is null, is not null
Timeat, not at, is any of, is none of, after, before, at or after, at or before, between, is null, is not null
Booleanis 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.

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

Filter editor popover for the order_date column. The Condition dropdown shows "relative" selected. A Preset dropdown shows "Last N days" with the value 7 entered below. An arrow points to the filter icon on the order_date row.

  1. In the Filters section, click + Add Filter.
  2. Pick a column — search by display name, technical path, or Data Mart name.
  3. Select an operator.
  4. Enter a value (if the operator requires one).
  5. 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 ×.

Edit report panel with two active filters in the Filters section: "category is Home" and "product_name is Coffee Machine". The "+ Add filter" button is circled. Sort is empty and Limit shows All rows.


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.

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 NULL on the joined columns.

To also drop source rows with no match, add a filter on the same column (is not blank).

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.

If you don’t see the Slices section, the report has no joined Data Marts. Join at least one first — see Joinable Data Marts.

  1. Expand the Slices section.
  2. Click + Add Slice.
  3. Pick a column — the picker groups joined columns under their Data Mart alias.
  4. Select an operator and enter a value.
  5. 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.

Edit report panel showing Filters with two rules (category is Home, product_name is Coffee Machine) and a Slices section with one active slice: order_timestamp from CRM Data, after "2026-06-01". An arrow points to the "+ Add slice" button.


Sort orders the rows in the delivered report. It runs on the final result, after filters and slices.

  1. Expand the Sort section.
  2. Click + Add Sort by.
  3. Choose a column and select Ascending or Descending.
  4. 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.

Edit report panel with all four sections configured. Filters: category is Home, product_name is Coffee Machine. Slices: order_timestamp from CRM Data after "2026-06-01". Sort: two rules — 1. category ascending, 2. payment_method descending. An arrow points to the "+ Add sort by" button. Limit shows All rows.


Limit caps the row count. It runs last — after filters, slices, and sort.

SettingValue
DefaultNo limit (all rows return)
Minimum1
Maximum10,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.

Edit report panel scrolled to show Slices, Sort, and Limit sections. Slices: order_timestamp from CRM Data after "2026-06-01". Sort: category ascending and payment_method descending. The Limit field shows 20 with a clear button. An arrow points to the Limit field.


OWOX applies output controls in this order on every report run:

  1. Slices — filter rows inside each joined subquery.
  2. Joins — join subqueries into the main query.
  3. Filters — filter the assembled result.
  4. Sort — order the remaining rows.
  5. Limit — cap the row count.

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.

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.

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.

Edit report panel with a red "Disconnected columns" group at the top of the column list, containing order_date with a checked checkbox. A tooltip is open showing "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." The remaining columns (order_id, customer_id, order_timestamp, product_id, product_name, category, customer_name, country) are listed below and appear valid.

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.

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.

"Output controls validation failed" error banner at the top of the page. The edit report panel shows the Sort section with two rules — category and payment_method — both highlighted in red with warning icons.