> ## Documentation Index
> Fetch the complete documentation index at: https://docs.omni.co/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.omni.co/feedback

```json
{
  "path": "/guides/modeling/nested-field-groups",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# Organize fields with nested groups

> Keep workbook field browsers navigable by grouping related fields.

export const categoryIcons = {
  'administration': 'lock',
  'api': 'terminal',
  'connections': 'database',
  'dashboards': 'table-columns',
  'embed': 'code',
  'errors': 'exclamation',
  'modeling': 'wrench',
  'patterns': 'plus',
  'schedules & alerts': 'envelope',
  'visualizations': 'chart-column',
  'workbooks': 'book'
};

export const GuideSidebar = ({category, relatedLinks, updatedDate}) => {
  const [progress, setProgress] = React.useState(0);
  React.useEffect(() => {
    const sidebar = document.querySelector('.guide-sidebar');
    if (!sidebar) return;
    let container = sidebar.parentElement;
    while (container && !container.querySelector('.guide-header')) {
      container = container.parentElement;
    }
    if (container && !container.classList.contains('guide-page-layout')) {
      container.classList.add('guide-page-layout');
    }
  }, []);
  React.useEffect(() => {
    const handleScroll = () => {
      const scrollTop = window.scrollY;
      const docHeight = document.documentElement.scrollHeight - window.innerHeight;
      const scrollPercent = docHeight > 0 ? scrollTop / docHeight * 100 : 0;
      setProgress(Math.min(100, Math.max(0, scrollPercent)));
    };
    window.addEventListener('scroll', handleScroll, {
      passive: true
    });
    handleScroll();
    return () => window.removeEventListener('scroll', handleScroll);
  }, []);
  const icon = category ? categoryIcons[category.toLowerCase()] || 'book' : 'book';
  return <aside className="guide-sidebar">
      <div className="guide-sidebar-content">
        <a href="/guides" className="guide-sidebar-back">
          <Icon icon="arrow-left" iconType="solid" size={14} />
          <span>All guides</span>
        </a>

        <div className="guide-sidebar-section">
          <div className="guide-sidebar-label">Progress</div>
          <div className="guide-sidebar-progress">
            <div className="guide-mascot">
              <svg viewBox="0 0 450 450" width="48" height="48">
                <defs>
                  <clipPath id="progressClip">
                    <rect x="0" y={450 - progress * 4.5} width="450" height={progress * 4.5} />
                  </clipPath>
                  <linearGradient id="blobbyGradient" x1="55.9753" y1="0" x2="492.197" y2="169.724" gradientUnits="userSpaceOnUse">
                    <stop stopColor="#BCA2F3" />
                    <stop offset="0.572917" stopColor="#FF7AA2" />
                    <stop offset="1" stopColor="#F3D4A2" />
                  </linearGradient>
                </defs>

                {}
                <circle cx="223.901" cy="223.901" r="213.901" transform="matrix(-0.999988 -0.0049013 0.00491945 -0.999988 447.797 449.992)" fill="#FAFAFA" stroke="#480B38" strokeWidth="20" />

                {}
                <circle cx="223.901" cy="223.901" r="213.901" transform="matrix(-0.999988 -0.0049013 0.00491945 -0.999988 447.797 449.992)" fill="url(#blobbyGradient)" stroke="#480B38" strokeWidth="20" clipPath="url(#progressClip)" />

                {}
                <path d="M310.41 195.084C310.41 200.052 301.362 212.472 284.328 212.472C266.585 212.472 258.246 201.294 258.246 195.912" stroke="#480B38" strokeWidth="17.3883" strokeMiterlimit="1.33344" strokeLinecap="round" />
                <circle cx="21.168" cy="21.168" r="21.168" transform="matrix(-1 0 0 1 388.658 169.001)" fill="#480B38" />
                <circle cx="21.168" cy="21.168" r="21.168" transform="matrix(-1 0 0 1 223.467 169.001)" fill="#480B38" />
              </svg>
            </div>
            <span className="guide-sidebar-progress-text">{Math.round(progress)}%</span>
          </div>
        </div>

        {category && <div className="guide-sidebar-section">
            <div className="guide-sidebar-label">Category</div>
            <div className="guide-sidebar-category">
              <Icon icon={icon} iconType="solid" size={14} />
              <span>{category}</span>
            </div>
          </div>}

        {updatedDate && <div className="guide-sidebar-section">
            <div className="guide-sidebar-label">Last updated</div>
            <div className="guide-sidebar-date">{updatedDate}</div>
          </div>}

        {relatedLinks && relatedLinks.length > 0 && <div className="guide-sidebar-section">
            <div className="guide-sidebar-label">Related</div>
            <ul className="guide-sidebar-links">
              {relatedLinks.map((link, index) => <li key={index}>
                  <a href={link.href}>{link.title}</a>
                </li>)}
            </ul>
          </div>}
      </div>
    </aside>;
};

export const GuideTitle = ({title}) => {
  return <div className="guide-header">
      <h1 className="guide-title">{title}</h1>
    </div>;
};

<GuideSidebar
  categoryIcons={categoryIcons}
  category="modeling"
  updatedDate="December 2025"
  relatedLinks={[
{ title: "Dimensions", href: "/modeling/dimensions" },
{ title: "Measures", href: "/modeling/measures" }
]}
/>

<GuideTitle title="Organize fields with nested groups" />

Grouping related fields together ensures that the field browser in workbooks is tidy and easily navigable.

## Limitations

**[Dimensions](/modeling/dimensions) and [measures](/modeling/measures) can't be grouped together.** Applying the same group label to a dimension and a measure will result in two groups displaying in the field browser, not one group with both fields.

## Group creation

Group structures are created by using the greater-than symbol (`>`) in a dimension or measure `group_label` parameter, which must have whitespace on either side. Each segment will become a collapsible group level in the field browser.

For example, to create the following structure in the field browser:

```markdown title="Field browser structure for Location group" theme={null}
▾ Location
  ▾ Address
      street_address
      city
  ▾ Coordinates
      latitude
      longitude
```

You would add the following `group_label` parameters to the `street_address`, `city`, `latitude`, and `longitude` dimensions:

```yaml title="Create a Location group with Address & Coordinates subgroups" theme={null}
dimensions:
  street_address:
    group_label: Location > Address

  city:
    group_label: Location > Address

  latitude:
    group_label: Location > Coordinates

  longitude:
    group_label: Location > Coordinates
```

This example used dimensions, but you can also create group structures for measure fields the same way. Nested groups are especially helpful for measures that answer the same question in slightly different ways, as it lets you start broad and drill into more specific definitions only when needed.

<Note>
  Aggregation types have been omitted in the following example to keep the focus on group creation.
</Note>

```yaml title="Grouping measures in a support_tickets view" theme={null}
measures:
  first_response_breach_by_day:
    group_label: SLA breaches > First response

  first_response_breach_by_month:
    group_label: SLA breaches > First response

  breach_resolution_by_day:
    group_label: SLA breaches > Resolution

  breach_resolution_by_month:
    group_label: SLA breaches > Resolution
```

Which will create the following structure in the field browser:

```markdown title="Field browser structure for SLA breaches group" theme={null}
▾ SLA breaches
  ▾ First response
      first_response_breach_by_day
      first_response_breach_by_month
  ▾ Resolution
      breach_resolution_by_day
      breach_resolution_by_month
```

## Nesting depth

Groups can be nested:

<Tabs>
  <Tab title="YAML">
    ```yaml theme={null}
    dimensions:
      detailed_address:
        group_label: Geography > Location > Address > Details
    ```
  </Tab>

  <Tab title="File browser result">
    ```markdown theme={null}
    ▾ Geography
      ▾ Location
        ▾ Address
          ▾ Details
            detailed_address
    ```
  </Tab>
</Tabs>

## Field browser collapse and expand behavior

Field groups will behave as follows:

* **Click a group header** to expand or collapse its contents
* **Nested groups** only appear when their parent group is expanded
* **Fields** only appear when all ancestor groups are expanded
* When you **select or filter** a field, its parent groups show an indicator so you can see which groups contain active selections even when collapsed
