PERCENTILE_DISC [analytic]

一个逆分布函数,在此函数中,对于每行,PERCENTILE_DISC 将返回 窗口内每个分区中的一组值中落入指定百分位的值。 PERCENTILE_DISC() 假设一个离散分布数据模型。 NULL 值将被忽略。

PERCENTILE_DISC 会检查每组中的累计离散值,直到找到大于或等于指定百分位的值。Vertica 会计算每一行的百分位,PERCENTILE_DISC 会输出 WITHIN GROUP(ORDER BY) 列的第一个值,其 CUME_DIST(累计离散)值大于等于实参 FLOAT 值(如 0.4):

PERCENTILE_DIST(0.4) WITHIN GROUP (ORDER BY salary) OVER(PARTITION BY deptno)...

给定以下查询:

SELECT CUME_DIST() OVER(ORDER BY salary) FROM table-name;

最小的大于 0.4 的 CUME_DIST 值也为 PERCENTILE_DISC

行为类型

不可变

语法

PERCENTILE_DISC ( percentile ) WITHIN GROUP (
    ORDER BY expression [ ASC | DESC ] ) OVER (
    [ window-partition-clause ] )

参数

percentile
百分位值,为 0 到 1(包含)范围内的 FLOAT 常数。
WITHIN GROUP(ORDER BY expression)
指定如何对每个组内的数据进行排序。 ORDER BY 仅使用数据类型为 INTEGERFLOATINTERVALNUMERIC 的列/表达式。 NULL 值将被丢弃。

WITHIN GROUP(ORDER BY) 子句不能保证 SQL 结果的顺序。要对最终结果进行排序,请使用 SQL ORDER BY 子句集。

ASC | DESC
将排序顺序指定为升序(默认值)或降序。
OVER()
请参阅分析函数

示例

该查询会计算威斯康星和哥伦比亚区的前 300 位客户的每组的第 20 个百分值年收入。

=> SELECT customer_state, customer_key, annual_income,
      PERCENTILE_DISC(.2) WITHIN GROUP(ORDER BY annual_income)
      OVER (PARTITION BY customer_state) AS PERCENTILE_DISC
   FROM customer_dimension
   WHERE customer_state IN ('DC','WI')
   AND customer_key < 300
   ORDER BY customer_state, customer_key;
 customer_state | customer_key | annual_income | PERCENTILE_DISC
----------------+--------------+---------------+-----------------
 DC             |          104 |        658383 |          417092
 DC             |          168 |        417092 |          417092
 DC             |          245 |        670205 |          417092
 WI             |          106 |        227279 |          227279
 WI             |          127 |        703889 |          227279
 WI             |          209 |        458607 |          227279
(6 rows)

另请参阅