# Aggregation Functions

Pinot provides support for aggregations using GROUP BY. You can use the following functions to get the aggregated value.

| Function                                                                                                                                              | Description                                                                                                                                                                                                                                                                                                                      | Example                                                                                                                                                                                                                                                                                                                                                                                                                                     | Default Value When No Record Selected                                                    |
| ----------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| [**COUNT**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/count)                                                     | Get the count of rows in a group                                                                                                                                                                                                                                                                                                 | `COUNT(*)`                                                                                                                                                                                                                                                                                                                                                                                                                                  | `0`                                                                                      |
| [**MIN**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/min)                                                         | Get the minimum value in a group                                                                                                                                                                                                                                                                                                 | `MIN(playerScore)`                                                                                                                                                                                                                                                                                                                                                                                                                          | `Double.POSITIVE_INFINITY`                                                               |
| [**MAX**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/max)                                                         | Get the maximum value in a group                                                                                                                                                                                                                                                                                                 | `MAX(playerScore)`                                                                                                                                                                                                                                                                                                                                                                                                                          | `Double.NEGATIVE_INFINITY`                                                               |
| [**SUM**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/sum)                                                         | Get the sum of values in a group                                                                                                                                                                                                                                                                                                 | `SUM(playerScore)`                                                                                                                                                                                                                                                                                                                                                                                                                          | `0`                                                                                      |
| [**AVG**](https://github.com/pinot-contrib/pinot-docs/blob/master/configuration-reference/functions/avg.md)                                           | Get the average of the values in a group                                                                                                                                                                                                                                                                                         | `AVG(playerScore)`                                                                                                                                                                                                                                                                                                                                                                                                                          | `Double.NEGATIVE_INFINITY`                                                               |
| [**MODE**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/mode)                                                       | Get the most frequent value in a group. When multiple modes are present it gives the minimum of all the modes. This behavior can be overridden to get the maximum or the average mode.                                                                                                                                           | <p><code>MODE(playerScore)</code></p><p><code>MODE(playerScore, 'MIN')</code></p><p><code>MODE(playerScore, 'MAX')</code></p><p><code>MODE(playerScore, 'AVG')</code></p>                                                                                                                                                                                                                                                                   | `Double.NEGATIVE_INFINITY`                                                               |
| [**MINMAXRANGE**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/minmaxrange)                                         | Returns the `max - min` value in a group                                                                                                                                                                                                                                                                                         | `MINMAXRANGE(playerScore)`                                                                                                                                                                                                                                                                                                                                                                                                                  | `Double.NEGATIVE_INFINITY`                                                               |
| [**PERCENTILE(column, N)**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/percentile)                                | Returns the Nth percentile of the group where N is a decimal number between 0 and 100 inclusive                                                                                                                                                                                                                                  | `PERCENTILE(playerScore, 50), PERCENTILE(playerScore, 99.9)`                                                                                                                                                                                                                                                                                                                                                                                | `Double.NEGATIVE_INFINITY`                                                               |
| [**PERCENTILEEST(column, N)**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/percentileest)                          | Returns the Nth percentile of the group using [Quantile Digest](https://github.com/airlift/airlift/blob/master/stats/src/main/java/io/airlift/stats/QuantileDigest.java) algorithm                                                                                                                                               | `PERCENTILEEST(playerScore, 50), PERCENTILEEST(playerScore, 99.9)`                                                                                                                                                                                                                                                                                                                                                                          | `Long.MIN_VALUE`                                                                         |
| [**PERCENTILETDigest(column, N)**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/percentiletdigest)                  | Returns the Nth percentile of the group using [T-digest algorithm](https://raw.githubusercontent.com/tdunning/t-digest/master/docs/t-digest-paper/histo.pdf)                                                                                                                                                                     | `PERCENTILETDIGEST(playerScore, 50), PERCENTILETDIGEST(playerScore, 99.9)`                                                                                                                                                                                                                                                                                                                                                                  | `Double.NaN`                                                                             |
| [**DISTINCTCOUNT**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/distinctcount)                                     | Returns the count of distinct row values in a group                                                                                                                                                                                                                                                                              | `DISTINCTCOUNT(playerName)`                                                                                                                                                                                                                                                                                                                                                                                                                 | `0`                                                                                      |
| [**DISTINCTCOUNTBITMAP**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/distinctcountbitmap)                         | Returns the count of distinct row values in a group. This function is accurate for *INT* column, but approximate for other cases where hash codes are used in distinct counting and there may be hash collisions.                                                                                                                | `DISTINCTCOUNTBITMAP(playerName)`                                                                                                                                                                                                                                                                                                                                                                                                           | `0`                                                                                      |
| [**DISTINCTCOUNTHLL**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/distinctcounthll)                               | Returns an approximate distinct count using *HyperLogLog*. It also takes an optional second argument to configure the *log2m* for the *HyperLogLog*.                                                                                                                                                                             | `DISTINCTCOUNTHLL(playerName, 12)`                                                                                                                                                                                                                                                                                                                                                                                                          | `0`                                                                                      |
| [**DISTINCTCOUNTRAWHLL**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/distinctcountrawhll)                         | Returns HLL response serialized as string. The serialized HLL can be converted back into an HLL and then aggregated with other HLLs. A common use case may be to merge HLL responses from different Pinot tables, or to allow aggregation after client-side batching.                                                            | `DISTINCTCOUNTRAWHLL(playerName)`                                                                                                                                                                                                                                                                                                                                                                                                           | `0`                                                                                      |
| [**DISTINCTCOUNTTHETASKETCH**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/distinctcountthetasketch)               | See [Cardinality Estimation](https://docs.pinot.apache.org/release-0.10.0/users/user-guide-query/how-to-handle-unique-counting)                                                                                                                                                                                                  |                                                                                                                                                                                                                                                                                                                                                                                                                                             | `0`                                                                                      |
| [**DISTINCTCOUNTRAWTHETASKETCH**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/distinctcountrawthetasketch)         | See [Cardinality Estimation](https://docs.pinot.apache.org/release-0.10.0/users/user-guide-query/how-to-handle-unique-counting)                                                                                                                                                                                                  |                                                                                                                                                                                                                                                                                                                                                                                                                                             | `0`                                                                                      |
| [**SEGMENTPARTITIONEDDISTINCTCOUNT**](https://docs.pinot.apache.org/release-0.10.0/configuration-reference/functions/segmentpartitioneddistinctcount) | Returns the count of distinct values of a column when the column is pre-partitioned for each segment, where there is no common value within different segments. This function calculates the exact count of distinct values within the segment, then simply sums up the results from different segments to get the final result. | `SEGMENTPARTITIONEDDISTINCTCOUNT(playerName)`                                                                                                                                                                                                                                                                                                                                                                                               | `0`                                                                                      |
| **LASTWITHTIME(dataColumn, timeColumn, 'dataType')**                                                                                                  | Get the last value of **dataColumn** where the **timeColumn** is used to define the time of dataColumn and the **dataType** specifies the type of dataColumn, which can be `BOOLEAN`, `INT`, `LONG`, `FLOAT`, `DOUBLE`, `STRING`                                                                                                 | <p><code>LASTWITHTIME(playerScore, timestampColumn, 'BOOLEAN')</code></p><p><code>LASTWITHTIME(playerScore, timestampColumn, 'INT')</code></p><p><code>LASTWITHTIME(playerScore, timestampColumn, 'LONG')</code></p><p><code>LASTWITHTIME(playerScore, timestampColumn, 'FLOAT')</code></p><p><code>LASTWITHTIME(playerScore, timestampColumn, 'DOUBLE')</code></p><p><code>LASTWITHTIME(playerScore, timestampColumn, 'STRING')</code></p> | `INT: Int.MIN_VALUE LONG: Long.MIN_VALUE FLOAT: Float.NaN DOUBLE: Double.NaN STRING: ""` |

Deprecated functions:

| Function    | Description                                                                                                                                                            | Example               |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| **FASTHLL** | FASTHLL stores serialized HyperLogLog in String format, which performs worse than DISTINCTCOUNTHLL, which supports serialized HyperLogLog in BYTES (byte array) format | `FASTHLL(playerName)` |

## Multi-value column functions

The following aggregation functions can be used for multi-value columns

| Function                                                                                                                                                                                                                                                                                                                                                                                           |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><a href="../../configuration-reference/functions/countmv"><strong>COUNTMV</strong></a><br>Get the count of rows in a group</p>                                                                                                                                                                                                                                                                  |
| <p><a href="../../configuration-reference/functions/minmv"><strong>MINMV</strong></a><br>Get the minimum value in a group</p>                                                                                                                                                                                                                                                                      |
| <p><a href="../../configuration-reference/functions/maxmv"><strong>MAXMV</strong></a><br>Get the maximum value in a group</p>                                                                                                                                                                                                                                                                      |
| <p><a href="../../configuration-reference/functions/summv"><strong>SUMMV</strong></a><br>Get the sum of values in a group</p>                                                                                                                                                                                                                                                                      |
| <p><a href="../../configuration-reference/functions/avgmv"><strong>AVGMV</strong></a><br>Get the avg of values in a group</p>                                                                                                                                                                                                                                                                      |
| <p><a href="../../configuration-reference/functions/minmaxrangemv"><strong>MINMAXRANGEMV</strong></a><br>Returns the <code>max - min</code> value in a group</p>                                                                                                                                                                                                                                   |
| <p><a href="../../configuration-reference/functions/percentilemv"><strong>PERCENTILEMV(column, N)</strong></a><br>Returns the Nth percentile of the group where N is a decimal number between 0 and 100 inclusive</p>                                                                                                                                                                              |
| <p><a href="../../configuration-reference/functions/percentileestmv"><strong>PERCENTILEESTMV(column, N)</strong></a><br>Returns the Nth percentile of the group using <a href="https://github.com/airlift/airlift/blob/master/stats/src/main/java/io/airlift/stats/QuantileDigest.java">Quantile Digest</a></p>                                                                                    |
| <p><a href="../../configuration-reference/functions/percentiletdigestmv"><strong>PERCENTILETDIGESTMV(column, N)</strong></a><br>Returns the Nth percentile of the group using <a href="https://raw.githubusercontent.com/tdunning/t-digest/master/docs/t-digest-paper/histo.pdf">T-digest algorithm</a></p>                                                                                        |
| <p><a href="../../configuration-reference/functions/distinctcountmv"><strong>DISTINCTCOUNTMV</strong></a><br>Returns the count of distinct row values in a group</p>                                                                                                                                                                                                                               |
| <p><a href="../../configuration-reference/functions/distinctcountbitmapmv"><strong>DISTINCTCOUNTBITMAPMV</strong></a><br>Returns the count of distinct row values in a group. This function is accurate for INT or dictionary encoded column, but approximate for other cases where hash codes are used in distinct counting and there may be hash collision.</p>                                  |
| <p><a href="../../configuration-reference/functions/distinctcounthllmv"><strong>DISTINCTCOUNTHLLMV</strong></a><br>Returns an approximate distinct count using HyperLogLog in a group</p>                                                                                                                                                                                                          |
| <p><a href="../../configuration-reference/functions/distinctcountrawhllmv"><strong>DISTINCTCOUNTRAWHLLMV</strong></a><br>Returns HLL response serialized as string. The serialized HLL can be converted back into an HLL and then aggregated with other HLLs. A common use case may be to merge HLL responses from different Pinot tables, or to allow aggregation after client-side batching.</p> |

Deprecated functions:

| Function                   | Description                                                                                                                                                    | Example                  |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| **FASTHLLMV (Deprecated)** | stores serialized HyperLogLog in String format, which performs worse than DISTINCTCOUNTHLL, which supports serialized HyperLogLog in BYTES (byte array) format | `FASTHLLMV(playerNames)` |
