Measures
You can use themeasures parameter within cubes to define measures.
Each measure is an aggregation over a certain column in your database table.
Any measure should have the following parameters: name, sql, and type.
Parameters
name
The name parameter serves as the identifier of a measure. It must be unique
among all measures, dimensions, and segments within a cube and follow the
naming conventions.
title
You can use the title parameter to change a measure’s displayed name. By
default, Cube will humanize your measure key to create a display name. In order
to override default behavior, please use the title parameter.
description
This parameter provides a human-readable description of a measure.
When applicable, it will be displayed in Playground and exposed
to data consumers via APIs and integrations.
public
The public parameter is used to manage the visibility of a measure. Valid
values for public are true and false. When set to false, this measure
cannot be queried through the API. Defaults to true.
meta
Custom metadata. Can be used to pass any information to the frontend.
sql
sql is a required parameter. It can take any valid SQL expression depending on
the type of the measure. Please refer to the Measure Types
Guide for detailed information on
the corresponding sql parameter.
sql parameter would either:
- Be skipped (in case of the
counttype). - Contain an aggregate function, e.g.,
STRING_AGG(string_dimension, ',')(in case ofstring,time,boolean, andnumbertypes). - Contain a non-aggregated expression that Cube would wrap into an aggregate
function according to the measure type (in case of the
avg,count_distinct,count_distinct_approx,min,max, andsumtypes).
mask
The optional mask parameter defines the replacement value used when the
measure is masked by a data masking access policy.
The mask can be a static value (number, boolean, or string) or a SQL expression.
When using a SQL expression, it should be an aggregate expression (the same way
as the measure’s sql parameter for number type measures), because
the mask replaces the entire measure expression including aggregation:
mask is defined, the default mask value is NULL. See
data masking for more details.
filters
If you want to add some conditions for a metric’s calculation, you should use
the filters parameter. The syntax looks like the following:
type
type is a required parameter. There are various types that can be assigned to
a measure. Please refer to the Measure
Types for the full list of measure
types.
rolling_window
The rolling_window parameter is used to for rolling window
calculations, e.g., to calculate a metric over a moving window of time, e.g. a
week or a month.
offset
The offset parameter is used to specify the starting point of the time window.
You can set the window offset parameter to either start or end, which will
match the start or end of the window.
By default, the offset parameter is set to end.
trailing and leading
The trailing and leading parameters define the size of the time window.
The trailing parameter defines the size of the window part before the offset point,
and the leading parameter defines the size of the window part after the offset point.
These parameters have a format defined as (-?\d+) (minute|hour|day|week|month|year).
It means that you can define these parameters using both positive and negative integers.
The trailing and leading parameters can also be set to unbounded,
which means infinite size for the corresponding window part.
By default, the leading and trailing parameters are set to zero.
unbounded window that’s used for cumulative counts:
multi_stage
The multi_stage parameter is used to define measures that are used with multi-stage
calculations, e.g., time-shift measures.
group_by
The group_by parameter is used with multi-stage measures to specify
dimensions that should be used for the GROUP BY of the inner aggregation stage,
ignoring any dimensions present in the query.
This is commonly used for fixed dimension calculations — computing a measure at a fixed
granularity regardless of the query’s dimensions. For example, calculating percent of
total or comparing individual items to a broader dataset.
group_by accepts a list of dimension names from the same cube. The inner stage will
group by only these dimensions, while the outer aggregation will group by the query’s
dimensions.
| Parameter | Inner GROUP BY | Outer GROUP BY |
|---|---|---|
group_by | Only the listed dimensions | Query dimensions |
reduce_by | Query dimensions minus listed | Query dimensions |
add_group_by | Query dimensions plus listed | Query dimensions |
reduce_by
The reduce_by parameter is used with multi-stage measures to specify
dimensions that should be removed from the GROUP BY of the inner aggregation stage.
This is commonly used for ranking calculations — computing a rank across a dimension
while still allowing grouping by other dimensions in the query.
reduce_by accepts a list of dimension names. The inner stage will group by the query’s
dimensions minus the listed dimensions, while the outer aggregation will group by the
query’s dimensions.
add_group_by
The add_group_by parameter is used with multi-stage measures to
specify dimensions that should be added to the GROUP BY of the inner aggregation
stage, in addition to any dimensions present in the query.
This is commonly used for nested aggregate patterns — computing
an aggregate of an aggregate. For example, averaging per-user metrics or counting how
many groups exceed a threshold.
add_group_by accepts a list of dimension names from the same cube. The listed
dimensions will be included in the inner stage’s GROUP BY but will not appear
in the outer aggregation — they are used only to define the granularity at which
the base measure is computed before the outer aggregation is applied.
time_shift
The time_shift parameter is used to configure a time shift for a
measure. It accepts an array of time shift configurations that consist of time_dimension,
type, interval, and name parameters.
type and interval
These parameters define the time shift direction and size. The type can be either
prior (shifting time backwards) or next (shifting time forwards).
The interval parameter defines the size of the time shift and has the following format:
quantity unit, e.g., 1 year or 7 days.
time_dimension
The time_dimension parameter is used to specify the time dimension for the time shift.
If it’s omitted, Cube will apply the time shift to all time dimensions in the query.
In this case, only single time shift configuration is allowed in time_shift.
If time_dimension is specified, the time shift will only happen if the query contains
this very time dimension. This is useful if you’d like to apply different time shifts to
different time dimensions or if you want to apply a time shift only when a specific time
dimension is present in the query.
name
The name parameter is used to reference a named time shift that is defined on a time
dimension from a calendar cube. Named time shifts are used in cases
when different measures use the same time shift configuration (e.g., prior + 1 year)
but have to be shifted differently depending on the custom calendar.
case
The case parameter is used to define conditional measures, i.e., measures that are
calculated based on the value of a switch dimension.
You do not need to include the sql parameter if the case parameter is used.
However, the multi_stage parameter must be set to true for case
measures.
format
format is an optional parameter. It is used to format the output of measures
in different ways, for example, as currency for revenue. Please refer to the
Measure Formats for the full
list of supported formats.
drill_members
Using the drill_members parameter, you can define a set of drill
down fields for the measure. drill_members is defined as an
array of dimensions. Cube automatically injects dimensions’ names and other
cubes’ names with dimensions in the context, so you can reference these
variables in the drill_members array. Learn more about how to define and use
drill downs.