Tyl*_*r_1 5 statistics percentile quantile google-bigquery quartile
根据文档:
返回一组表达式值的近似边界,其中 number 表示要创建的分位数数。此函数返回一个由 number + 1 个元素组成的数组,其中第一个元素是近似最小值,最后一个元素是近似最大值。
听起来如果我想要真正的四分位数,我需要使用APPROX_QUANTILES(values, 4)which 将返回[minvalue, 1st quartile, 2nd quartile, 3rd quartile, maxvalue]
根据https://en.wikipedia.org/wiki/Quartile,四分位数集包含 3 个数据点 - 其中没有一个是数据的最小值/最大值。
我的假设正确吗?是APPROX_QUANTILES(values, 4)要返回真正的四分位?
作为基线,这是没有任何修改的输出,使用 1 到 100 之间的数字输入:
SELECT APPROX_QUANTILES(x, 4) AS output
FROM UNNEST(GENERATE_ARRAY(1, 100)) AS x;
+----------------------------+
| output |
+----------------------------+
| ["1","25","50","75","100"] |
+----------------------------+
Run Code Online (Sandbox Code Playgroud)
输出包括最小值 (1) 和最大值 (100)。如果您只想要四分位数,则需要将它们从数组中删除。为了可读性/可组合性,最好使用临时 SQL UDF 来执行此操作。在这里,我使用INT64元素类型,但您也可以使用不同的元素类型:
CREATE TEMP FUNCTION StripFirstLast(arr ARRAY<INT64>) AS (
ARRAY(SELECT x FROM UNNEST(arr) AS x WITH OFFSET
WHERE OFFSET BETWEEN 1 AND ARRAY_LENGTH(arr) - 2)
);
SELECT
APPROX_QUANTILES(x, 4) AS output,
StripFirstLast(APPROX_QUANTILES(x, 4)) AS quartiles
FROM UNNEST(GENERATE_ARRAY(1, 100)) AS x;
+----------------------------+------------------+
| output | quartiles |
+----------------------------+------------------+
| ["1","25","50","75","100"] | ["25","50","75"] |
+----------------------------+------------------+
Run Code Online (Sandbox Code Playgroud)
您可以看到该quartiles数组仅包含所需的值。