Google BigQuery APPROX_QUANTILES和获取真正的四分位数

7
根据文档
该函数返回一个表达式值组的近似边界,其中 number 表示要创建的分位数数量。此函数返回一个由 number + 1 个元素组成的数组,其中第一个元素是近似最小值,最后一个元素是近似最大值。
看起来,如果我想要真正的四分位数,我需要使用 APPROX_QUANTILES(values, 4),将返回[minvalue,第一四分位数,第二四分位数,第三四分位数,maxvalue] 根据https://en.wikipedia.org/wiki/Quartile,四分位数集包含3个数据点 - 其中没有一个是数据的最小/最大值。
我的假设正确吗?APPROX_QUANTILES(values, 4)是否会返回真正的四分位数?

你的问题是什么?你想知道如何返回一个移除了第一个元素的数组吗? - Elliott Brossard
编辑后的问题更清晰了吗 - 我会得到4个四分位数吗? - Tyler_1
1个回答

8
作为基准,这是没有任何修改的输出结果,使用介于1和100之间的数字作为输入:
SELECT APPROX_QUANTILES(x, 4) AS output
FROM UNNEST(GENERATE_ARRAY(1, 100)) AS x;
+----------------------------+
|           output           |
+----------------------------+
| ["1","25","50","75","100"] |
+----------------------------+

输出包含最小值(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"] |
+----------------------------+------------------+

你可以看到quartiles数组仅包含所需的值。

1
谢谢您提供这个示例,它完美地展示了逻辑。 - Tyler_1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接