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

# Aggregate Functions

> GROUP BY computations: COUNT, SUM, AVG, MIN, MAX, and more

## Aggregate functions

Aggregate functions compute a single result from a set of rows.

### COUNT

Counts rows or non-null values. Use `COUNT(1)` for total row counts and `COUNT(column)` for counting non-null values.

```sql theme={null}
SELECT COUNT(1) AS total_rows FROM company_data."123"
SELECT COUNT(email) AS emails_present FROM company_data."123"

-- For distinct counts, prefer APPROX_COUNT_DISTINCT (see below)
SELECT COUNT(DISTINCT user_id) AS unique_users FROM company_data."123"
```

### APPROX\_COUNT\_DISTINCT

Returns the approximate number of distinct values in a column. Faster and cheaper than `COUNT(DISTINCT ...)`, and returns exact results for low-cardinality columns. Use this instead of `COUNT(DISTINCT ...)` unless your query requires a guaranteed exact count.

```sql theme={null}
SELECT APPROX_COUNT_DISTINCT(user_id) AS unique_users FROM company_data."123"
```

<Tip>
  `APPROX_COUNT_DISTINCT` is the recommended way to count unique values in most queries. It produces exact results when the number of distinct values is small and near-exact results at scale—while using significantly fewer resources than `COUNT(DISTINCT ...)`.
</Tip>

### SUM

Returns the sum of values.

```sql theme={null}
SELECT SUM(amount) AS total_amount FROM company_data."123"
```

### AVG

Returns the average of values.

```sql theme={null}
SELECT AVG(score) AS average_score FROM company_data."123"
```

### MIN / MAX

Returns the minimum or maximum value.

```sql theme={null}
SELECT MIN(created_at) AS earliest FROM company_data."123"
SELECT MAX(score) AS highest_score FROM company_data."123"
```

### STDDEV\_POP / STDDEV\_SAMP

Returns population or sample standard deviation.

```sql theme={null}
SELECT STDDEV_POP(value) AS std_dev FROM company_data."123"
SELECT STDDEV_SAMP(value) AS sample_std_dev FROM company_data."123"
```

### VAR\_POP / VAR\_SAMP

Returns population or sample variance.

```sql theme={null}
SELECT VAR_POP(value) AS variance FROM company_data."123"
SELECT VAR_SAMP(value) AS sample_variance FROM company_data."123"
```

### ARRAY\_AGG

Aggregates values into an array.

```sql theme={null}
SELECT user_id, ARRAY_AGG(tag) AS all_tags
FROM company_data."123"
GROUP BY user_id
```

### STRING\_AGG

Concatenates values into a delimited string.

```sql theme={null}
SELECT user_id, STRING_AGG(category, ', ') AS categories
FROM company_data."123"
GROUP BY user_id
```

### PERCENTILE\_CONT

Returns a percentile value using continuous distribution.

```sql theme={null}
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY value) AS median
FROM company_data."123"

SELECT PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY response_time) AS p95
FROM company_data."123"
```

***

## Related content

<CardGroup cols={2}>
  <Card title="Window Functions" icon="window" href="/nql/functions/window-functions">
    Ranking and analytics
  </Card>

  <Card title="Numeric Functions" icon="hashtag" href="/nql/functions/numeric-functions">
    Math and rounding
  </Card>

  <Card title="All Functions" icon="function" href="/nql/functions/index">
    Browse all function categories
  </Card>

  <Card title="SELECT" icon="magnifying-glass" href="/nql/commands/select">
    GROUP BY and HAVING clauses
  </Card>
</CardGroup>
