类别:

聚合函数 (通用)、窗口函数

PERCENTILE_DISC

根据输入列(在 order_by_expr 中指定)的离散分布返回百分位值。返回值是具有最小 CUME_DIST 值(大于或等于给定百分位数)的行。计算中将忽略 NULL 值。

另请参阅:

PERCENTILE_CONT

语法

聚合函数

PERCENTILE_DISC( <percentile> ) WITHIN GROUP (ORDER BY <order_by_expr> )
Copy

窗口函数

PERCENTILE_DISC( <percentile> ) WITHIN GROUP (ORDER BY <order_by_expr> ) OVER ( [ PARTITION BY <expr3> ] )
Copy

实参

percentile

要查找的值的百分位数。百分位数必须是介于 0.0 和 1.0 之间的常量。例如,如果要查找第 90 个百分位数的值,请指定 0.9。

order_by_expr

用于对值进行排序的表达式(通常为列名)。例如,如果要查找数学 SAT 分数为第 90 个百分位的学生,请指定包含数学 SAT 分数的列。

请注意,这也是从中隐式选择返回值的列。例如,如果您按数学 SAT 分数排序,则结果是数学 SAT 分数之一。不能按一列排序并获取另一列的百分位值。

expr3

这是可选表达式,用于将行分组到分区。

返回

返回位于指定百分位数的值。

使用说明

  • 函数的 percentile 实参必须是常量。

  • 此函数不支持 DISTINCT。

  • 函数 PERCENTILE_CONT 在两个最接近的值之间进行插值,而函数 PERCENTILE_DISC 选择最接近的值而不是插值。

  • 用作窗口函数时:

    • 此函数不支持:

      • OVER() 子句中的 ORDER BY 分子句。

      • 窗口框架。

示例

以下示例显示了各个组中第 25 个百分位数 (0.25) 处的值:

创建并使用以下值填充表:

create or replace table aggr(k int, v decimal(10,2));
insert into aggr (k, v) values
    (0,  0),
    (0, 10),
    (0, 20),
    (0, 30),
    (0, 40),
    (1, 10),
    (1, 20),
    (2, 10),
    (2, 20),
    (2, 25),
    (2, 30),
    (3, 60),
    (4, NULL);
Copy

运行查询并显示输出:

select k, percentile_disc(0.25) within group (order by v) 
  from aggr 
  group by k
  order by k;
+---+-------------------------------------------------+
| K | PERCENTILE_DISC(0.25) WITHIN GROUP (ORDER BY V) |
|---+-------------------------------------------------|
| 0 |                                           10.00 |
| 1 |                                           10.00 |
| 2 |                                           10.00 |
| 3 |                                           60.00 |
| 4 |                                            NULL |
+---+-------------------------------------------------+
Copy
语言: 中文