

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# PERCENTILE\$1CONT 函数
<a name="r_PERCENTILE_CONT"></a>

PERCENTILE\$1CONT 是一种假定连续分布模型的逆分布函数。该函数具有一个百分比值和一个排序规范，并返回一个在有关排序规范的给定百分比值范围内的内插值。

PERCENTILE\$1CONT 在对值进行排序后计算值之间的线性内插。通过在聚合组中使用百分比值 `(P)` 和非 null 行数 `(N)`，该函数会在根据排序规范对行进行排序后计算行号。根据公式 `(RN)` 计算此行号 `RN = (1+ (P*(N-1))`。聚合函数的最终结果通过行号 `CRN = CEILING(RN)` 和 `FRN = FLOOR(RN)` 的行中的值之间的线性内插计算。

最终结果将如下所示。

如果 `(CRN = FRN = RN)`，则结果为 `(value of expression from row at RN)` 

否则，结果将如下所示：

`(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)`.

## 语法
<a name="r_PERCENTILE_CONT-synopsis"></a>

```
PERCENTILE_CONT(percentile)
WITHIN GROUP(ORDER BY expr)
```

## 参数
<a name="r_PERCENTILE_CONT-arguments"></a>

 *percentile*   
介于 0 和 1 之间的数值常数。计算中将忽略 `NULL` 值。

*\$1 expr*  
指定用于排序和计算百分比的数字或日期/时间值。

## 返回值
<a name="r_PERCENTILE_CONT-returns"></a>

返回类型由 WITHIN GROUP 子句中的 ORDER BY 表达式的数据类型决定。下表显示了每种个 ORDER BY 表达式数据类型的返回类型。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/redshift/latest/dg/r_PERCENTILE_CONT.html)

## 使用说明
<a name="r_PERCENTILE_CONT-usage-notes"></a>

如果 ORDER BY 表达式是使用 38 位最大精度定义的 DECIMAL 数据类型，则 PERCENTILE\$1CONT 可能将返回不准确的结果或错误。如果 PERCENTILE\$1CONT 函数的返回值超过 38 位，结果将截断以符合规范，这将导致精度降低。如果在插值期间，中间结果超出最大精度，则会发生数值溢出且函数会返回错误。要避免这些情况，建议使用具有较低精度的数据类型或将 ORDER BY 表达式转换为较低精度。

如果语句包括对基于排序的聚合函数 (LISTAGG、PERCENTILE\$1CONT 或 MEDIAN) 的多个调用，则它们必须全都使用相同的 ORDER BY 值。请注意，MEDIAN 对表达式值应用隐式排序依据。

例如，以下语句将返回错误。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

An error occurred when executing the SQL command:
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

ERROR: within group ORDER BY clauses for aggregate functions must be the same
```

以下语句将成功运行。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(salesid)
FROM sales 
GROUP BY salesid, pricepaid;
```

## 示例
<a name="r_PERCENTILE_CONT-examples"></a>

以下示例使用 TICKIT 示例数据库。有关更多信息，请参阅 [示例数据库](c_sampledb.md)。

以下示例显示 PERCENTILE\$1CONT(0.5) 生成与 MEDIAN 相同的结果。

```
SELECT TOP 10 DISTINCT sellerid, qtysold, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold),
MEDIAN(qtysold) 
FROM sales
GROUP BY sellerid, qtysold;

+----------+---------+-----------------+--------+
| sellerid | qtysold | percentile_cont | median |
+----------+---------+-----------------+--------+
|        2 |       2 |               2 |      2 |
|       26 |       1 |               1 |      1 |
|       33 |       1 |               1 |      1 |
|       38 |       1 |               1 |      1 |
|       43 |       1 |               1 |      1 |
|       48 |       2 |               2 |      2 |
|       48 |       3 |               3 |      3 |
|       77 |       4 |               4 |      4 |
|       85 |       4 |               4 |      4 |
|       95 |       2 |               2 |      2 |
+----------+---------+-----------------+--------+
```

以下示例为 SALES 表中每个 sellerid 的销售量找到 PERCENTILE\$1CONT(0.5) 和 PERCENTILE\$1CONT(0.75)。

```
SELECT sellerid, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold) as pct_50,
PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY qtysold) as pct_75
FROM sales
GROUP BY sellerid
ORDER BY sellerid
LIMIT 10;

+----------+--------+---------+
| sellerid | pct_50 | pct_75 |
+----------+--------+---------+
|        1 |    1.5 |    1.75 |
|        2 |      2 |    2.25 |
|        3 |      2 |       3 |
|        4 |      2 |       2 |
|        5 |      1 |     1.5 |
|        6 |      1 |       1 |
|        7 |    1.5 |    1.75 |
|        8 |      1 |       1 |
|        9 |      4 |       4 |
|       12 |      2 |    3.25 |
+----------+--------+---------+
```

要验证第一个 sellerid 的上一次查询的结果，请使用以下示例。

```
SELECT qtysold 
FROM sales 
WHERE sellerid=1;

+---------+
| qtysold |
+---------+
|       2 |
|       1 |
+---------+
```