# Aggregate Functions¶

Aggregate functions are functions that define an operation which consumes values from multiple records to a produce a single output. Aggregate functions in SQL are typically used in GROUP BY functions. Aggregate functions are similar to scalar functions and function signatures with a small set of different properties.

Aggregate function signatures contain all the properties defined for scalar functions. Additionally, they contain the properties below:

Property | Description | Required |
---|---|---|

Inherits | All properties defined for scalar function. | N/A |

Ordered | Whether the result of this function is sensitive to sort order. | Optional, defaults to false |

Maximum set size | Maximum allowed set size as an unsigned integer. | Optional, defaults to unlimited |

Decomposable | Whether the function can be executed in one or more intermediate steps. Valid options are: `NONE` , `ONE` , `MANY` , describing how intermediate steps can be taken. | Optional, defaults to `NONE` |

Intermediate Output Type | If the function is decomposable, represents the intermediate output type that is used, if the function is defined as either `ONE` or `MANY` decomposable. Will be a struct in many cases. | Required for `ONE` and `MANY` . |

Invocation | Whether the function uses all or only distinct values in the aggregation calculation. Valid options are: `ALL` , `DISTINCT` . | Optional, defaults to `ALL` |

## Aggregate Binding¶

When binding an aggregate function, the binding must include the following additional properties beyond the standard scalar binding properties:

Property | Description |
---|---|

Phase | Describes the input type of the data: [INITIAL_TO_INTERMEDIATE, INTERMEDIATE_TO_INTERMEDIATE, INITIAL_TO_RESULT, INTERMEDIATE_TO_RESULT] describing what portion of the operation is required. For functions that are NOT decomposable, the only valid option will be INITIAL_TO_RESULT. |

Ordering | Zero or more ordering keys along with key order (ASC|DESC|NULL FIRST, etc.), declared similar to the sort keys in an `ORDER BY` relational operation. If no sorts are specified, the records are not sorted prior to being passed to the aggregate function. |