APPROXIMATE_COUNT_DISTINCT

返回数据集中不同的非 NULL 值数量。

行为类型

不可变

语法

APPROXIMATE_COUNT_DISTINCT ( expression[, error-tolerance ] )

参数

表达式
要使用支持等式比较的任何数据类型评估的值。
error‑tolerance

表示所需容错百分比的数字值,分布在此函数返回的值周围。容错值越小,近似值越接近实际值。

您可以将 error‑tolerance 设置为最小值 0.88。Vertica 不实施最大值限制,但大于 5 的任何值都以 5% 的容错实现。

如果省略此实参,则 Vertica 将使用 1.25(%) 的容错率。

限制

APPROXIMATE_COUNT_DISTINCT 和 DISTINCT 聚合不能在同一查询块中。

容错

APPROXIMATE_COUNT_DISTINCT(x, error‑tolerance) 返回的值等于 COUNT(DISTINCT x),而误差以标准差呈对数正态分布。

参数 error‑tolerance 是可选参数。提供此实参以指定所需的标准偏差。error‑tolerance 被定义为 2.17 个标准偏差,对应 97% 的置信区间:

standard-deviation = error‑tolerance / 2.17

例如:

  • error‑tolerance = 1

    Default setting, corresponds to a standard deviation

    97 percent of the time, APPROXIMATE_COUNT_DISTINCT(x,5) returns a value between:

    • COUNT(DISTINCT x) * 0.99
    • COUNT(DISTINCT x) * 1.01
  • error‑tolerance = 5

    97% 的时间, APPROXIMATE_COUNT_DISTINCT(x) 返回介于以下两者之间的值:

    • COUNT(DISTINCT x) * 0.95
    • COUNT(DISTINCT x) * 1.05

99% 的置信区间对应 2.58 个标准偏差。要将 error-tolerance 设置为对应于 99%(而不是 97) 的置信水平,请将 error-tolerance 乘以 2.17 / 2.58 = 0.841

例如,如果您将 error-tolerance 指定为 5 * 0.841 = 4.2,则 APPROXIMATE_COUNT_DISTINCT(x,4.2) 返回的值是介于以下结果之间的时间的 99%:

  • COUNT (DISTINCT x) * 0.95
  • COUNT (DISTINCT x) * 1.05

示例

计算表 store.store_sales_factproduct_key 列中不同值的总数:

=> SELECT COUNT(DISTINCT product_key) FROM store.store_sales_fact;
 COUNT
-------
 19982
(1 row)

计算具有不同容错值的 product_key 中不同值的近似值。容错值越小,近似值越接近实际值:


=> SELECT APPROXIMATE_COUNT_DISTINCT(product_key,5) AS five_pct_accuracy,
   APPROXIMATE_COUNT_DISTINCT(product_key,1) AS one_pct_accuracy,
   APPROXIMATE_COUNT_DISTINCT(product_key,.88) AS point_eighteight_pct_accuracy
   FROM store.store_sales_fact;

 five_pct_accuracy | one_pct_accuracy | point_eighteight_pct_accuracy
-------------------+------------------+-------------------------------
             19431 |            19921 |                         19921
(1 row)

另请参阅

近似计数区分函数