123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- [role="xpack"]
- [testenv="basic"]
- [[sql-functions-aggs]]
- === Aggregate Functions
- Functions for computing a _single_ result from a set of input values.
- {es-sql} supports aggregate functions only alongside <<sql-syntax-group-by,grouping>> (implicit or explicit).
- [[sql-functions-aggs-general]]
- [float]
- === General Purpose
- [[sql-functions-aggs-avg]]
- ==== `AVG`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- AVG(numeric_field) <1>
- --------------------------------------------------
- *Input*:
- <1> numeric field
- *Output*: `double` numeric value
- .Description:
- Returns the https://en.wikipedia.org/wiki/Arithmetic_mean[Average] (arithmetic mean) of input values.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggAvg]
- --------------------------------------------------
- [[sql-functions-aggs-count]]
- ==== `COUNT`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- COUNT(expression) <1>
- --------------------------------------------------
- *Input*:
- <1> a field name, wildcard (`*`) or any numeric value
- *Output*: numeric value
- .Description:
- Returns the total number (count) of input values.
- In case of `COUNT(*)` or `COUNT(<literal>)`, _all_ values are considered (including `null` or missing ones).
- In case of `COUNT(<field_name>)` `null` values are not considered.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggCountStar]
- --------------------------------------------------
- [[sql-functions-aggs-count-all]]
- ==== `COUNT(ALL)`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- COUNT(ALL field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a field name
- *Output*: numeric value
- .Description:
- Returns the total number (count) of all _non-null_ input values. `COUNT(<field_name>)` and `COUNT(ALL <field_name>)` are equivalent.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggCountAll]
- --------------------------------------------------
- [[sql-functions-aggs-count-distinct]]
- ==== `COUNT(DISTINCT)`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- COUNT(DISTINCT field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a field name
- *Output*: numeric value
- .Description:
- Returns the total number of _distinct non-null_ values in input values.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggCountDistinct]
- --------------------------------------------------
- [[sql-functions-aggs-first]]
- ==== `FIRST/FIRST_VALUE`
- .Synopsis:
- [source, sql]
- ----------------------------------------------
- FIRST(
- field_name <1>
- [, ordering_field_name]) <2>
- ----------------------------------------------
- *Input*:
- <1> target field for the aggregation
- <2> optional field used for ordering
- *Output*: same type as the input
- .Description:
- Returns the first **non-NULL** value (if such exists) of the `field_name` input column sorted by
- the `ordering_field_name` column. If `ordering_field_name` is not provided, only the `field_name`
- column is used for the sorting. E.g.:
- [cols="<,<"]
- |===
- s| a | b
- | 100 | 1
- | 200 | 1
- | 1 | 2
- | 2 | 2
- | 10 | null
- | 20 | null
- | null | null
- |===
- [source, sql]
- ----------------------
- SELECT FIRST(a) FROM t
- ----------------------
- will result in:
- [cols="<"]
- |===
- s| FIRST(a)
- | 1
- |===
- and
- [source, sql]
- -------------------------
- SELECT FIRST(a, b) FROM t
- -------------------------
- will result in:
- [cols="<"]
- |===
- s| FIRST(a, b)
- | 100
- |===
- ["source","sql",subs="attributes,macros"]
- -----------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[firstWithOneArg]
- -----------------------------------------------------------
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[firstWithOneArgAndGroupBy]
- --------------------------------------------------------------------
- ["source","sql",subs="attributes,macros"]
- -----------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[firstWithTwoArgs]
- -----------------------------------------------------------
- ["source","sql",subs="attributes,macros"]
- ---------------------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[firstWithTwoArgsAndGroupBy]
- ---------------------------------------------------------------------
- `FIRST_VALUE` is a name alias and can be used instead of `FIRST`, e.g.:
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[firstValueWithTwoArgsAndGroupBy]
- --------------------------------------------------------------------------
- [NOTE]
- `FIRST` cannot be used in a HAVING clause.
- [NOTE]
- `FIRST` cannot be used with columns of type <<text, `text`>> unless
- the field is also <<before-enabling-fielddata,saved as a keyword>>.
- [[sql-functions-aggs-last]]
- ==== `LAST/LAST_VALUE`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- LAST(
- field_name <1>
- [, ordering_field_name]) <2>
- --------------------------------------------------
- *Input*:
- <1> target field for the aggregation
- <2> optional field used for ordering
- *Output*: same type as the input
- .Description:
- It's the inverse of <<sql-functions-aggs-first>>. Returns the last **non-NULL** value (if such exists) of the
- `field_name`input column sorted descending by the `ordering_field_name` column. If `ordering_field_name` is not
- provided, only the `field_name` column is used for the sorting. E.g.:
- [cols="<,<"]
- |===
- s| a | b
- | 10 | 1
- | 20 | 1
- | 1 | 2
- | 2 | 2
- | 100 | null
- | 200 | null
- | null | null
- |===
- [source, sql]
- ------------------------
- SELECT LAST(a) FROM t
- ------------------------
- will result in:
- [cols="<"]
- |===
- s| LAST(a)
- | 200
- |===
- and
- [source, sql]
- ------------------------
- SELECT LAST(a, b) FROM t
- ------------------------
- will result in:
- [cols="<"]
- |===
- s| LAST(a, b)
- | 2
- |===
- ["source","sql",subs="attributes,macros"]
- -----------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[lastWithOneArg]
- -----------------------------------------------------------
- ["source","sql",subs="attributes,macros"]
- -------------------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[lastWithOneArgAndGroupBy]
- -------------------------------------------------------------------
- ["source","sql",subs="attributes,macros"]
- -----------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[lastWithTwoArgs]
- -----------------------------------------------------------
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[lastWithTwoArgsAndGroupBy]
- --------------------------------------------------------------------
- `LAST_VALUE` is a name alias and can be used instead of `LAST`, e.g.:
- ["source","sql",subs="attributes,macros"]
- -------------------------------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[lastValueWithTwoArgsAndGroupBy]
- -------------------------------------------------------------------------
- [NOTE]
- `LAST` cannot be used in `HAVING` clause.
- [NOTE]
- `LAST` cannot be used with columns of type <<text, `text`>> unless
- the field is also <<before-enabling-fielddata,`saved as a keyword`>>.
- [[sql-functions-aggs-max]]
- ==== `MAX`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- MAX(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: same type as the input
- .Description:
- Returns the maximum value across input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggMax]
- --------------------------------------------------
- [NOTE]
- `MAX` on a field of type <<text, `text`>> or <<keyword, `keyword`>> is translated into
- <<sql-functions-aggs-last>> and therefore, it cannot be used in `HAVING` clause.
- [[sql-functions-aggs-min]]
- ==== `MIN`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- MIN(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: same type as the input
- .Description:
- Returns the minimum value across input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggMin]
- --------------------------------------------------
- [NOTE]
- `MIN` on a field of type <<text, `text`>> or <<keyword, `keyword`>> is translated into
- <<sql-functions-aggs-first>> and therefore, it cannot be used in `HAVING` clause.
- [[sql-functions-aggs-sum]]
- ==== `SUM`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- SUM(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: `bigint` for integer input, `double` for floating points
- .Description:
- Returns the sum of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggSum]
- --------------------------------------------------
- [[sql-functions-aggs-statistics]]
- [float]
- === Statistics
- [[sql-functions-aggs-kurtosis]]
- ==== `KURTOSIS`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- KURTOSIS(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: `double` numeric value
- .Description:
- https://en.wikipedia.org/wiki/Kurtosis[Quantify] the shape of the distribution of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggKurtosis]
- --------------------------------------------------
- [[sql-functions-aggs-mad]]
- ==== `MAD`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- MAD(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: `double` numeric value
- .Description:
- https://en.wikipedia.org/wiki/Median_absolute_deviation[Measure] the variability of the input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggMad]
- --------------------------------------------------
- [[sql-functions-aggs-percentile]]
- ==== `PERCENTILE`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- PERCENTILE(
- field_name, <1>
- numeric_exp) <2>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- <2> a numeric expression (must be a constant and not based on a field)
- *Output*: `double` numeric value
- .Description:
- Returns the nth https://en.wikipedia.org/wiki/Percentile[percentile] (represented by `numeric_exp` parameter)
- of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggPercentile]
- --------------------------------------------------
- [[sql-functions-aggs-percentile-rank]]
- ==== `PERCENTILE_RANK`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- PERCENTILE_RANK(
- field_name, <1>
- numeric_exp) <2>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- <2> a numeric expression (must be a constant and not based on a field)
- *Output*: `double` numeric value
- .Description:
- Returns the nth https://en.wikipedia.org/wiki/Percentile_rank[percentile rank] (represented by `numeric_exp` parameter)
- of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggPercentileRank]
- --------------------------------------------------
- [[sql-functions-aggs-skewness]]
- ==== `SKEWNESS`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- SKEWNESS(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: `double` numeric value
- .Description:
- https://en.wikipedia.org/wiki/Skewness[Quantify] the asymmetric distribution of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggSkewness]
- --------------------------------------------------
- [[sql-functions-aggs-stddev-pop]]
- ==== `STDDEV_POP`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- STDDEV_POP(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: `double` numeric value
- .Description:
- Returns the https://en.wikipedia.org/wiki/Standard_deviations[population standard deviation] of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggStddevPop]
- --------------------------------------------------
- [[sql-functions-aggs-sum-squares]]
- ==== `SUM_OF_SQUARES`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- SUM_OF_SQUARES(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: `double` numeric value
- .Description:
- Returns the https://en.wikipedia.org/wiki/Total_sum_of_squares[sum of squares] of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggSumOfSquares]
- --------------------------------------------------
- [[sql-functions-aggs-var-pop]]
- ==== `VAR_POP`
- .Synopsis:
- [source, sql]
- --------------------------------------------------
- VAR_POP(field_name) <1>
- --------------------------------------------------
- *Input*:
- <1> a numeric field
- *Output*: `double` numeric value
- .Description:
- Returns the https://en.wikipedia.org/wiki/Variance[population variance] of input values in the field `field_name`.
- ["source","sql",subs="attributes,macros"]
- --------------------------------------------------
- include-tagged::{sql-specs}/docs/docs.csv-spec[aggVarPop]
- --------------------------------------------------
|