> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> quantilesGK 的工作方式与 quantileGK 类似，但它支持同时计算多个级别的分位数，并返回一个数组。

# quantilesGK

<div id="quantilesGK">
  ## quantilesGK
</div>

引入版本：v23.4.0

使用 [Greenwald-Khanna](http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf) 算法，同时计算数值数据序列在不同级别上的多个[分位数](https://en.wikipedia.org/wiki/Quantile)。

此函数与 [`quantileGK`](/zh/reference/functions/aggregate-functions/quantileGK) 的工作方式类似，但它支持在单次遍历中计算多个分位数级别，因此比分别调用单个分位数函数更高效。

Greenwald-Khanna 算法是一种以极高效率计算数据流分位数的算法。
该算法由 Michael Greenwald 和 Sanjeev Khanna 于 2001 年提出。
它非常高效，仅需 O(log n) 的空间，且每个条目的处理时间为 O(log log n) (其中 n 为输入大小) 。
它也具有很高的精度，能够以可控精度提供近似分位数值。

**语法**

```sql theme={null}
quantilesGK(accuracy, level1, level2, ...)(expr)
```

**参数**

* `accuracy` — 分位数精度。常量正整数。`accuracy` 值越大，误差越小。例如，如果 `accuracy` 参数设为 100，则计算出的分位数有很高概率将误差控制在 1% 以内。计算分位数的精度与算法的计算复杂度之间需要权衡。[`UInt*`](/zh/reference/data-types/int-uint)
* `level` — 分位数级别。一个或多个介于 0 到 1 之间的常量浮点数。[`Float*`](/zh/reference/data-types/float)

**Arguments**

* `expr` — 基于列值计算的 expression，结果为数值 data types、Date 或 DateTime。[`(U)Int*`](/zh/reference/data-types/int-uint) 或 [`Float*`](/zh/reference/data-types/float) 或 [`Decimal*`](/zh/reference/data-types/decimal) 或 [`Date`](/zh/reference/data-types/date) 或 [`DateTime`](/zh/reference/data-types/datetime)

**返回值**

按指定级别的顺序返回对应分位数的数组。[`Array(Float64)`](/zh/reference/data-types/array) 或 [`Array(Date)`](/zh/reference/data-types/array) 或 [`Array(DateTime)`](/zh/reference/data-types/array)

**示例**

**使用 GK 算法计算多个分位数**

```sql title=Query theme={null}
SELECT quantilesGK(1, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
```

```response title=Response theme={null}
┌─quantilesGK(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [1, 1, 1]                                        │
└──────────────────────────────────────────────────┘
```

**更高精度分位数**

```sql title=Query theme={null}
SELECT quantilesGK(100, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
```

```response title=Response theme={null}
┌─quantilesGK(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [251, 498, 741]                                    │
└────────────────────────────────────────────────────┘
```
