APPROX_PERCENTILE()

APPROX_PERCENTILE(expr, percentile) 在不对全部输入排序的情况下估算数值表达式的分位数。

描述

APPROX_PERCENTILE 是一个聚合函数。它会忽略 expr 中的 NULL 值,并为每个分组返回请求分位数的近似值。

第一个参数支持 BIT、有符号和无符号整数、FLOAT32FLOAT64DECIMAL64 以及 DECIMAL128 输入。返回类型由输入类型决定:

输入类型

返回类型

BIT、整数、无符号整数、FLOAT32FLOAT64

FLOAT64

DECIMAL64DECIMAL128

DECIMAL128(38, scale);当输入精度小于 38 时,scale 增加 1

输入精度已经是 38 的 DECIMAL 会保留输入 scale。DECIMAL 插值结果会按声明的结果 scale 舍入。

语法

APPROX_PERCENTILE(expr, percentile)

参数

参数

说明

expr

受支持的数值表达式;其中的 NULL 值会被忽略。

percentile

[0, 1] 闭区间内非 NULL、有限的常量;0.5 表示中位数。

不支持 DISTINCT 修饰符。输入为空或全部为 NULL 时返回 NULL

示例

DROP DATABASE IF EXISTS approx_percentile_demo;
CREATE DATABASE approx_percentile_demo;
USE approx_percentile_demo;

CREATE TABLE t1 (a INT, b INT, d DECIMAL(10, 2));
INSERT INTO t1 VALUES (1, 1, 1.10), (2, 3, 3.30), (3, 5, 5.50), (4, 7, 7.70), (5, 9, 9.90);
SELECT APPROX_PERCENTILE(b, 0.5) AS p50 FROM t1;
SELECT APPROX_PERCENTILE(b, 0.95) AS p95 FROM t1;
SELECT APPROX_PERCENTILE(d, 0.5) AS decimal_p50 FROM t1;
SELECT a, APPROX_PERCENTILE(b, 0.5) AS p50 FROM t1 GROUP BY a ORDER BY a;
SELECT APPROX_PERCENTILE(CAST(NULL AS INT), 0.5) AS all_null_result;

DROP DATABASE approx_percentile_demo;

以下形式会被拒绝:

-- Expected-Success: false
SELECT APPROX_PERCENTILE(b, NULL) FROM t1;
-- Expected-Success: false
SELECT APPROX_PERCENTILE(b, 1.1) FROM t1;