Bonnard Docs
ModelingCubes

Segments

Define reusable row-level filters.

Overview

Segments are predefined filters that can be applied to queries. They make common filtering patterns reusable and ensure consistent definitions across analyses.

Example

cubes:
  - name: orders
    sql: SELECT * FROM orders

    segments:
      - name: completed
        sql: "\{CUBE\}.status = 'completed'"

      - name: high_value
        sql: "\{CUBE\}.amount > 1000"

      - name: this_year
        sql: "YEAR(\{CUBE\}.created_at) = YEAR(CURRENT_DATE)"

Syntax

Basic Segment

segments:
  - name: active
    sql: "\{CUBE\}.is_active = true"

Multiple Conditions

segments:
  - name: premium_active
    sql: "\{CUBE\}.is_active = true AND \{CUBE\}.plan = 'premium'"

Using References

segments:
  - name: has_recent_order
    sql: "\{CUBE\}.last_order_date > CURRENT_DATE - INTERVAL '30 days'"

Segments vs Filters

SegmentsQuery Filters
Predefined in modelApplied at query time
Named and reusableAd-hoc
Part of the schemaPart of the query
Self-documentingRequires context

Segments vs Filtered Measures

Use CaseSolution
Filter all measures in a querySegment
Create a specific filtered metricFiltered measure
# Segment: filters entire query
segments:
  - name: completed
    sql: "\{CUBE\}.status = 'completed'"

# Filtered measure: only this metric
measures:
  - name: completed_count
    type: count
    filters:
      - sql: "\{CUBE\}.status = 'completed'"

Common Patterns

Status Segments

segments:
  - name: pending
    sql: "\{CUBE\}.status = 'pending'"
  - name: completed
    sql: "\{CUBE\}.status = 'completed'"
  - name: cancelled
    sql: "\{CUBE\}.status = 'cancelled'"

Time-based Segments

segments:
  - name: last_7_days
    sql: "\{CUBE\}.created_at >= CURRENT_DATE - INTERVAL '7 days'"
  - name: last_30_days
    sql: "\{CUBE\}.created_at >= CURRENT_DATE - INTERVAL '30 days'"

Business Logic Segments

segments:
  - name: churned
    sql: "\{CUBE\}.last_activity_at < CURRENT_DATE - INTERVAL '90 days'"
  - name: high_value_customer
    sql: "\{CUBE\}.lifetime_value > 10000"

See Also

  • cubes
  • cubes.measures.filters
  • views