From b2656b06a4d421ef21206fea2464a5b24aae1d32 Mon Sep 17 00:00:00 2001 From: Ti Chi Robot Date: Thu, 18 Jul 2024 15:49:31 +0800 Subject: [PATCH] Update window function docs (#17991) (#18029) --- .../expressions-pushed-down.md | 5 + functions-and-operators/window-functions.md | 475 +++++++++++++++++- keywords.md | 10 +- system-variables.md | 6 +- 4 files changed, 471 insertions(+), 25 deletions(-) diff --git a/functions-and-operators/expressions-pushed-down.md b/functions-and-operators/expressions-pushed-down.md index e892e6f5d82f..5a2e021406d4 100644 --- a/functions-and-operators/expressions-pushed-down.md +++ b/functions-and-operators/expressions-pushed-down.md @@ -9,6 +9,10 @@ summary: TiDB 中下推到 TiKV 的表达式列表及相关设置。 TiFlash 也支持[本页](/tiflash/tiflash-supported-pushdown-calculations.md)列出的函数和算子下推。 +> **注意:** +> +> 当作为[窗口函数](/functions-and-operators/window-functions.md)使用时,聚合函数不支持下推到 TiKV。 + ## 已支持下推的表达式列表 | 表达式分类 | 具体操作 | @@ -25,6 +29,7 @@ TiFlash 也支持[本页](/tiflash/tiflash-supported-pushdown-calculations.md) | [加密和压缩函数](/functions-and-operators/encryption-and-compression-functions.md#加密和压缩函数) | [MD5()](/functions-and-operators/encryption-and-compression-functions.md#md5)
[SHA1(), SHA()](/functions-and-operators/encryption-and-compression-functions.md#sha1)
[UNCOMPRESSED_LENGTH()](/functions-and-operators/encryption-and-compression-functions.md#uncompressed_length) | | [Cast 函数](/functions-and-operators/cast-functions-and-operators.md#cast-函数和操作符) | [CAST()](/functions-and-operators/cast-functions-and-operators.md#cast)
[CONVERT()](/functions-and-operators/cast-functions-and-operators.md#convert) | | [其他函数](/functions-and-operators/miscellaneous-functions.md#支持的函数) | [UUID()](/functions-and-operators/miscellaneous-functions.md#uuid) | +| [窗口函数](/functions-and-operators/window-functions.md) | 无 | ## 禁止特定表达式下推 diff --git a/functions-and-operators/window-functions.md b/functions-and-operators/window-functions.md index c240a7fa25bd..9a5d6783cec9 100644 --- a/functions-and-operators/window-functions.md +++ b/functions-and-operators/window-functions.md @@ -5,22 +5,471 @@ summary: TiDB 中的窗口函数与 MySQL 8.0 基本一致。可以将 `tidb_ena # 窗口函数 -TiDB 中窗口函数的使用方法与 MySQL 8.0 基本一致,详情可参见 [MySQL 窗口函数](https://dev.mysql.com/doc/refman/8.0/en/window-functions.html)。由于窗口函数会使用一些保留关键字,可能导致原先可以正常执行的 SQL 语句在升级 TiDB 后无法被解析语法,此时可以将 `tidb_enable_window_function` 设置为 `0`,该参数的默认值为 `1`。 +TiDB 中窗口函数的使用方法与 MySQL 8.0 基本一致,详情可参见 [MySQL 窗口函数](https://dev.mysql.com/doc/refman/8.0/en/window-functions.html)。 + +在 TiDB 中,你可以使用以下系统变量来控制窗口功能: + +- [`tidb_enable_window_function`](/system-variables.md#tidb_enable_window_function):由于窗口函数会使用一些保留[关键字](/keywords.md),TiDB 提供了该系统变量用于关闭窗口函数功能。如果原先可以正常执行的 SQL 语句在升级 TiDB 后语法无法被解析,此时可以将 [`tidb_enable_window_function`](/system-variables.md#tidb_enable_window_function) 设置为 `OFF`。 +- [`tidb_enable_pipelined_window_function`](/system-variables.md#tidb_enable_pipelined_window_function):你可以使用该系统变量禁用窗口函数的流水线执行算法。 +- [`windowing_use_high_precision`](/system-variables.md#windowing_use_high_precision):你可以使用该变量为窗口函数关闭高精度模式。 [本页](/tiflash/tiflash-supported-pushdown-calculations.md)列出的窗口函数可以下推到 TiFlash。 -TiDB 支持除 `GROUP_CONCAT()` 和 `APPROX_PERCENTILE()` 以外的所有 [`GROUP BY` 聚合函数](/functions-and-operators/aggregate-group-by-functions.md)。此外,TiDB 支持的其他窗口函数如下: +TiDB 支持除 `GROUP_CONCAT()` 和 `APPROX_PERCENTILE()` 以外的所有 [`GROUP BY` 聚合函数](/functions-and-operators/aggregate-group-by-functions.md)作为窗口函数。此外,TiDB 支持的其他窗口函数如下: | 函数名 | 功能描述 | | :-------------- | :------------------------------------- | -| [`CUME_DIST()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_cume-dist) | 返回一组值中的累积分布 | -| [`DENSE_RANK()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_dense-rank) | 返回分区中当前行的排名,并且排名是连续的| -| [`FIRST_VALUE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_first-value) | 当前窗口中第一行的表达式值 | -| [`LAG()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_lag) | 分区中当前行前面第 N 行的表达式值| -| [`LAST_VALUE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_last-value) | 当前窗口中最后一行的表达式值 | -| [`LEAD()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_lead) | 分区中当前行后面第 N 行的表达式值 | -| [`NTH_VALUE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_nth-value) | 当前窗口中第 N 行的表达式值 | -| [`NTILE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_ntile)| 将分区划分为 N 桶,为分区中的每一行分配桶号 | -| [`PERCENT_RANK()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_percent-rank)|返回分区中小于当前行的百分比 | -| [`RANK()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_rank)| 返回分区中当前行的排名,排名可能不连续 | -| [`ROW_NUMBER()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number)| 返回分区中当前行的编号 | +| [`CUME_DIST()`](#cume_dist) | 返回一组值中的累积分布 | +| [`DENSE_RANK()`](#dense_rank) | 返回分区中当前行的排名,并且排名是连续的| +| [`FIRST_VALUE()`](#first_value) | 当前窗口中第一行的表达式值 | +| [`LAG()`](#lag) | 分区中当前行前面第 N 行的表达式值| +| [`LAST_VALUE()`](#last_value) | 当前窗口中最后一行的表达式值 | +| [`LEAD()`](#lead) | 分区中当前行后面第 N 行的表达式值 | +| [`NTH_VALUE()`](#nth_value) | 当前窗口中第 N 行的表达式值 | +| [`NTILE()`](#ntile) | 将分区划分为 N 桶,为分区中的每一行分配桶号 | +| [`PERCENT_RANK()`](#percent_rank)| 返回分区中小于当前行的百分比 | +| [`RANK()`](#rank) | 返回分区中当前行的排名,排名可能不连续 | +| [`ROW_NUMBER()`](#row_number) | 返回分区中当前行的编号 | + +## [`CUME_DIST()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_cume-dist) + +`CUME_DIST()` 计算一个值在一组值中的累积分布。请注意,你需要在 `CUME_DIST()` 后使用 `ORDER BY` 子句对该组中的值进行排序。否则,此函数将不会返回预期值。 + +```sql +WITH RECURSIVE cte(n) AS ( + SELECT 1 + UNION + SELECT + n+2 + FROM + cte + WHERE + n<6 +) +SELECT + *, + CUME_DIST() OVER(ORDER BY n) +FROM + cte; +``` + +``` ++------+------------------------------+ +| n | CUME_DIST() OVER(ORDER BY n) | ++------+------------------------------+ +| 1 | 0.25 | +| 3 | 0.5 | +| 5 | 0.75 | +| 7 | 1 | ++------+------------------------------+ +4 rows in set (0.00 sec) +``` + +## [`DENSE_RANK()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_dense-rank) + +`DENSE_RANK()` 函数返回当前行的排名。它的作用类似于 [`RANK()`](#rank),但在处理具有相同值和排序条件的行时能够确保排名是连续的。 + +```sql +SELECT + *, + DENSE_RANK() OVER (ORDER BY n) +FROM ( + SELECT 5 AS 'n' + UNION ALL + SELECT 8 + UNION ALL + SELECT 5 + UNION ALL + SELECT 30 + UNION ALL + SELECT 31 + UNION ALL + SELECT 32) a; +``` + +``` ++----+--------------------------------+ +| n | DENSE_RANK() OVER (ORDER BY n) | ++----+--------------------------------+ +| 5 | 1 | +| 5 | 1 | +| 8 | 2 | +| 30 | 3 | +| 31 | 4 | +| 32 | 5 | ++----+--------------------------------+ +6 rows in set (0.00 sec) +``` + +## [`FIRST_VALUE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_first-value) + +`FIRST_VALUE(expr)` 返回窗口中的第一个值。 + +下面的示例使用了两个不同的窗口定义: + +- `PARTITION BY n MOD 2 ORDER BY n` 将表 `a` 中的数据分为两组:`1, 3` 和 `2, 4`。因此会返回 `1` 或 `2`,因为它们是这两组的第一个值。 +- `PARTITION BY n <= 2 ORDER BY n` 将表 `a` 中的数据分为两组:`1, 2` 和 `3, 4`。因此,它会返回 `1` 或 `3`,取决于 `n` 属于哪一组。 + +```sql +SELECT + n, + FIRST_VALUE(n) OVER (PARTITION BY n MOD 2 ORDER BY n), + FIRST_VALUE(n) OVER (PARTITION BY n <= 2 ORDER BY n) +FROM ( + SELECT 1 AS 'n' + UNION + SELECT 2 + UNION + SELECT 3 + UNION + SELECT 4 +) a +ORDER BY + n; +``` + +``` ++------+-------------------------------------------------------+------------------------------------------------------+ +| n | FIRST_VALUE(n) OVER (PARTITION BY n MOD 2 ORDER BY n) | FIRST_VALUE(n) OVER (PARTITION BY n <= 2 ORDER BY n) | ++------+-------------------------------------------------------+------------------------------------------------------+ +| 1 | 1 | 1 | +| 2 | 2 | 1 | +| 3 | 1 | 3 | +| 4 | 2 | 3 | ++------+-------------------------------------------------------+------------------------------------------------------+ +4 rows in set (0.00 sec) +``` + +## [`LAG()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_lag) + +函数 `LAG(expr [, num [, default]])` 返回当前行之前第 `num` 行的 `expr` 值。如果不存在该行,则返回 `default` 值。默认情况下,未指定时,`num` 为 `1`,`default` 为 `NULL`。 + +在下面的示例中,由于未指定 `num`,`LAG(n)` 返回上一行中 `n` 的值。当 `n` 为 `1` 时,由于上一行不存在,且未指定 `default` 值,`LAG(1)` 返回 `NULL`。 + +```sql +WITH RECURSIVE cte(n) AS ( + SELECT 1 + UNION + SELECT + n+1 + FROM + cte + WHERE + n<10 +) +SELECT + n, + LAG(n) OVER () +FROM + cte; +``` + +``` ++------+----------------+ +| n | LAG(n) OVER () | ++------+----------------+ +| 1 | NULL | +| 2 | 1 | +| 3 | 2 | +| 4 | 3 | +| 5 | 4 | +| 6 | 5 | +| 7 | 6 | +| 8 | 7 | +| 9 | 8 | +| 10 | 9 | ++------+----------------+ +10 rows in set (0.01 sec) +``` + +## [`LAST_VALUE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_last-value) + +`LAST_VALUE()` 函数返回窗口中的最后一个值。 + +```sql +WITH RECURSIVE cte(n) AS ( + SELECT + 1 + UNION + SELECT + n+1 + FROM + cte + WHERE + n<10 +) +SELECT + n, + LAST_VALUE(n) OVER (PARTITION BY n<=5) +FROM + cte +ORDER BY + n; +``` + +``` ++------+----------------------------------------+ +| n | LAST_VALUE(n) OVER (PARTITION BY n<=5) | ++------+----------------------------------------+ +| 1 | 5 | +| 2 | 5 | +| 3 | 5 | +| 4 | 5 | +| 5 | 5 | +| 6 | 10 | +| 7 | 10 | +| 8 | 10 | +| 9 | 10 | +| 10 | 10 | ++------+----------------------------------------+ +10 rows in set (0.00 sec) +``` + +## [`LEAD()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_lead) + +函数 `LEAD(expr [, num [,default]])` 返回当前行之后第 `num` 行的 `expr` 值。如果不存在该行,则返回 `default` 值。默认情况下,未指定时,`num` 为 `1`,`default` 为 `NULL`。 + +在下面的示例中,由于未指定 `num`,`LEAD(n)` 返回当前行之后下一行中 `n` 的值。当 `n` 为 `10` 时,由于下一行不存在,且未指定 `default` 值,`LEAD(10)` 返回 `NULL`。 + +```sql +WITH RECURSIVE cte(n) AS ( + SELECT + 1 + UNION + SELECT + n+1 + FROM + cte + WHERE + n<10 +) +SELECT + n, + LEAD(n) OVER () +FROM + cte; +``` + +``` ++------+-----------------+ +| n | LEAD(n) OVER () | ++------+-----------------+ +| 1 | 2 | +| 2 | 3 | +| 3 | 4 | +| 4 | 5 | +| 5 | 6 | +| 6 | 7 | +| 7 | 8 | +| 8 | 9 | +| 9 | 10 | +| 10 | NULL | ++------+-----------------+ +10 rows in set (0.00 sec) +``` + +## [`NTH_VALUE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_nth-value) + +函数 `NTH_VALUE(expr, n)` 返回窗口的第 n 个值。 + +```sql +WITH RECURSIVE cte(n) AS ( + SELECT + 1 + UNION + SELECT + n+1 + FROM + cte + WHERE + n<10 +) +SELECT + n, + FIRST_VALUE(n) OVER w AS 'First', + NTH_VALUE(n, 2) OVER w AS 'Second', + NTH_VALUE(n, 3) OVER w AS 'Third', + LAST_VALUE(n) OVER w AS 'Last' +FROM + cte +WINDOW + w AS (PARTITION BY n<=5) +ORDER BY + n; +``` + +``` ++------+-------+--------+-------+------+ +| n | First | Second | Third | Last | ++------+-------+--------+-------+------+ +| 1 | 1 | 2 | 3 | 5 | +| 2 | 1 | 2 | 3 | 5 | +| 3 | 1 | 2 | 3 | 5 | +| 4 | 1 | 2 | 3 | 5 | +| 5 | 1 | 2 | 3 | 5 | +| 6 | 6 | 7 | 8 | 10 | +| 7 | 6 | 7 | 8 | 10 | +| 8 | 6 | 7 | 8 | 10 | +| 9 | 6 | 7 | 8 | 10 | +| 10 | 6 | 7 | 8 | 10 | ++------+-------+--------+-------+------+ +10 rows in set (0.00 sec) +``` + +## [`NTILE()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_ntile) + +`NTILE(n)` 函数将窗口划分为 `n` 个分组,并返回各行的分组编号。 + +```sql +WITH RECURSIVE cte(n) AS ( + SELECT + 1 + UNION + SELECT + n+1 + FROM + cte + WHERE + n<10 +) +SELECT + n, + NTILE(5) OVER (), + NTILE(2) OVER () +FROM + cte; +``` + +``` ++------+------------------+------------------+ +| n | NTILE(5) OVER () | NTILE(2) OVER () | ++------+------------------+------------------+ +| 1 | 1 | 1 | +| 2 | 1 | 1 | +| 3 | 2 | 1 | +| 4 | 2 | 1 | +| 5 | 3 | 1 | +| 6 | 3 | 2 | +| 7 | 4 | 2 | +| 8 | 4 | 2 | +| 9 | 5 | 2 | +| 10 | 5 | 2 | ++------+------------------+------------------+ +10 rows in set (0.00 sec) +``` + +## [`PERCENT_RANK()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_percent-rank) + +`PERCENT_RANK()` 函数返回一个介于 0 和 1 之间的数字,表示值小于当前行值的行的百分比。 + +```sql +SELECT + *, + PERCENT_RANK() OVER (ORDER BY n), + PERCENT_RANK() OVER (ORDER BY n DESC) +FROM ( + SELECT 5 AS 'n' + UNION ALL + SELECT 8 + UNION ALL + SELECT 5 + UNION ALL + SELECT 30 + UNION ALL + SELECT 31 + UNION ALL + SELECT 32) a; +``` + +``` ++----+----------------------------------+---------------------------------------+ +| n | PERCENT_RANK() OVER (ORDER BY n) | PERCENT_RANK() OVER (ORDER BY n DESC) | ++----+----------------------------------+---------------------------------------+ +| 5 | 0 | 0.8 | +| 5 | 0 | 0.8 | +| 8 | 0.4 | 0.6 | +| 30 | 0.6 | 0.4 | +| 31 | 0.8 | 0.2 | +| 32 | 1 | 0 | ++----+----------------------------------+---------------------------------------+ +6 rows in set (0.00 sec) +``` + +## [`RANK()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_rank) + +`RANK()` 函数的作用类似于 [`DENSE_RANK()`](#dense_rank),但在处理具有相同值和排序条件的行时返回的排名是不连续的。这意味着它提供的是绝对排名。例如,排名 7 意味着有 6 个行的排名更靠前。 + +```sql +SELECT + *, + RANK() OVER (ORDER BY n), + DENSE_RANK() OVER (ORDER BY n) +FROM ( + SELECT 5 AS 'n' + UNION ALL + SELECT 8 + UNION ALL + SELECT 5 + UNION ALL + SELECT 30 + UNION ALL + SELECT 31 + UNION ALL + SELECT 32) a; +``` + +``` ++----+--------------------------+--------------------------------+ +| n | RANK() OVER (ORDER BY n) | DENSE_RANK() OVER (ORDER BY n) | ++----+--------------------------+--------------------------------+ +| 5 | 1 | 1 | +| 5 | 1 | 1 | +| 8 | 3 | 2 | +| 30 | 4 | 3 | +| 31 | 5 | 4 | +| 32 | 6 | 5 | ++----+--------------------------+--------------------------------+ +6 rows in set (0.00 sec) +``` + +## [`ROW_NUMBER()`](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number) + +`ROW_NUMBER()` 返回结果集中当前行的行号。 + +```sql +WITH RECURSIVE cte(n) AS ( + SELECT + 1 + UNION + SELECT + n+3 + FROM + cte + WHERE + n<30 +) +SELECT + n, + ROW_NUMBER() OVER () +FROM + cte; +``` + +``` ++------+----------------------+ +| n | ROW_NUMBER() OVER () | ++------+----------------------+ +| 1 | 1 | +| 4 | 2 | +| 7 | 3 | +| 10 | 4 | +| 13 | 5 | +| 16 | 6 | +| 19 | 7 | +| 22 | 8 | +| 25 | 9 | +| 28 | 10 | +| 31 | 11 | ++------+----------------------+ +11 rows in set (0.00 sec) +``` diff --git a/keywords.md b/keywords.md index 6c405c9aae1f..db4b3300f918 100644 --- a/keywords.md +++ b/keywords.md @@ -7,12 +7,10 @@ summary: 本文介绍 TiDB 的关键字。 本文介绍 TiDB 的关键字,对保留字和非保留字作出区分,并汇总所有的关键字以供查询使用。 -关键字是 SQL 语句中具有特殊含义的单词,例如 `SELECT`,`UPDATE`,`DELETE` 等等。它们之中有的能够直接作为标识符,被称为**非保留关键字**(简称**非保留字**),但有需要经过特殊处理才能作为标识符的字,被称为**保留关键字**(简称**保留字**)。但是,也存在一些特殊的非保留关键字,有时候可能也需要进行特殊处理,推荐你将它们当作保留关键字处理。 +关键字是 SQL 语句中具有特殊含义的单词,例如 [`SELECT`](/sql-statements/sql-statement-select.md)、[`UPDATE`](/sql-statements/sql-statement-update.md) 和 [`DELETE`](/sql-statements/sql-statement-delete.md) 等等。它们之中有的能够直接作为标识符,被称为**非保留关键字**(简称**非保留字**),但有需要经过特殊处理才能作为标识符的字,被称为**保留关键字**(简称**保留字**)。但是,也存在一些特殊的非保留关键字,有时候可能也需要进行特殊处理,推荐你将它们当作保留关键字处理。 对于保留字,必须使用反引号包裹,才能作为标识符被使用。例如: -{{< copyable "sql" >}} - ```sql CREATE TABLE select (a INT); ``` @@ -21,8 +19,6 @@ CREATE TABLE select (a INT); ERROR 1105 (HY000): line 0 column 19 near " (a INT)" (total length 27) ``` -{{< copyable "sql" >}} - ```sql CREATE TABLE `select` (a INT); ``` @@ -33,8 +29,6 @@ Query OK, 0 rows affected (0.09 sec) 而非保留字则不需要反引号也能直接作为标识符。例如 `BEGIN` 和 `END` 是非保留字,以下语句能够正常执行: -{{< copyable "sql" >}} - ```sql CREATE TABLE `select` (BEGIN int, END int); ``` @@ -45,8 +39,6 @@ Query OK, 0 rows affected (0.09 sec) 有一种特殊情况,如果使用了限定符 `.`,那么也不需要用反引号: -{{< copyable "sql" >}} - ```sql CREATE TABLE test.select (BEGIN int, END int); ``` diff --git a/system-variables.md b/system-variables.md index 0003ae1ab2f8..c88bbee3c565 100644 --- a/system-variables.md +++ b/system-variables.md @@ -2190,7 +2190,7 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 - 类型:布尔型 - 默认值:`ON` -- 该变量指定是否对窗口函数采用流水线的执行算法。 +- 该变量指定是否对[窗口函数](/functions-and-operators/window-functions.md)采用流水线的执行算法。 ### `tidb_enable_plan_cache_for_param_limit` 从 v6.6.0 版本开始引入 @@ -2427,7 +2427,7 @@ Query OK, 0 rows affected (0.09 sec) - 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 - 类型:布尔型 - 默认值:`ON` -- 这个变量用来控制是否开启窗口函数的支持。默认值 1 代表开启窗口函数的功能。 +- 这个变量用来控制是否开启[窗口函数](/functions-and-operators/window-functions.md)的支持。 - 由于窗口函数会使用一些保留关键字,可能导致原先可以正常执行的 SQL 语句在升级 TiDB 后无法被解析语法,此时可以将 `tidb_enable_window_function` 设置为 `OFF`。 ### `tidb_enable_row_level_checksum` 从 v7.1.0 版本开始引入 @@ -5404,4 +5404,4 @@ Query OK, 0 rows affected, 1 warning (0.00 sec) - 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 - 类型:布尔型 - 默认值:`ON` -- 这个变量用于控制计算窗口函数时是否采用高精度模式。 +- 这个变量用于控制计算[窗口函数](/functions-and-operators/window-functions.md)时是否采用高精度模式。