diff --git "a/content/docs-lite/zh/docs/SQLReference/KEEP\345\207\275\346\225\260.md" "b/content/docs-lite/zh/docs/SQLReference/KEEP\345\207\275\346\225\260.md"
new file mode 100755
index 0000000000000000000000000000000000000000..c239b0355d6de28560772a0c91a430f3dfafd143
--- /dev/null
+++ "b/content/docs-lite/zh/docs/SQLReference/KEEP\345\207\275\346\225\260.md"
@@ -0,0 +1,94 @@
+# KEEP函数
+
+## KEEP函数
+
+仅在openGauss数据库A模式下支持KEEP函数的使用,该函数用于对一组行中的值进行操作,将这组行按照指定的排序规则排序后返回排在第一或最后的值。可以将其用作聚合或分析函数。
+
+列存表目前暂不支持;
+
+该函数语法如下:
+aggregate_function KEEP ( DENSE_RANK { FIRST | LAST } ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [, expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ]]...
+)[ OVER ( [query_partition_clause] ) ]
+
+
+
+
+
+参数说明:
+
+| 参数 | 解释说明 |
+|---------------------------|-------------------------------------------------------------------------------------------------------|
+| aggregate_function | 指定聚合函数的种类。 |
+| DENSE_RANK | 为各组内值生成连续排序序号,其中相同的值具有相同序号。 |
+| expr | 可以是任何表达式。 |
+| FIRST/LAST | 指定返回 expr 排序后那个位置的值。FIRST表示返回排在首位的值。LAST返回排在最后的值。 |
+| DESC/ASC | 指定列表的排序方式,为可选项。ASC为升序排序,默认值。DESC为降序排序。 |
+| NULLS { FIRST/LAST } | 排序后 expr 中 NULL 值的位置,为可选项。NULLS FIRST表示 NULL值排在非空值的前面。NULLS LAST表示NULL值排在非空值的后面,为默认值。 |
+| OVER | 使用 OVER 子句定义窗口进行计算。 |
+| query_partition_clause | 用于定义窗口函数的分区依据,指定对哪些列进行分组。数据会按这些列的值进行划分,每个分区内的数据会单独进行窗口计算。|
+
+keep函数支持的聚集函数列表:
+| 函数名称 | 描述 |
+|---------------|-------------------------------------------------------------|
+| min(expression) | 所有输入行中 expression 的最小值。 |
+| max(expression) | 所有输入行中 expression 的最大值。 |
+| sum(expression) | 所有输入行的 expression 总和。 |
+| avg(expression) | 所有输入值的均值(算术平均)。 |
+| count(expression) | 返回查询到的数据的数量。 |
+| stddev(expression) | stddev_samp 的别名,计算一组数值的样本标准差。 |
+| variance(expression) | var_samp 的别名,计算一组数值的样本方差。 |
+
+> **说明:**
+>
+>KEEP函数用于对一组行中的值进行操作,将这组行按照指定的排序规则排序后返回排在第一或最后的值。可以将其用作聚合或分析函数。
+
+
+- 示例
+ ```
+--创建表 employees,并向里面插入数据。
+
+create database db dbcompatibility 'A';
+CREATE DATABASE
+
+\c db
+Non-SSL connection (SSL connection is recommended when requiring high-security)
+You are now connected to database "db" as user "hmy".
+
+CREATE TABLE employees (department_id INT,manager_id INT,last_name varchar(50),hiredate varchar(50),SALARY INT);
+CREATE TABLE
+
+INSERT INTO employees VALUES
+(30, 100, 'Raphaely', '2017-07-01', 1700),
+(30, 100, 'De Haan', '2018-05-01',11000),
+(40, 100, 'Errazuriz', '2017-07-21', 1400),
+(50, 100, 'Hartstein', '2019-10-05',14000),
+(50, 100, 'Raphaely', '2017-07-22', 1700),
+(50, 100, 'Weiss', '2019-10-05',13500),
+(90, 100, 'Russell', '2019-07-11', 13000),
+(90,100, 'Partners', '2018-12-01',14000);
+INSERT 0 8
+
+--(1)聚合函数示例
+--按照薪水排序,对排在第一的员工的薪水求和;按照雇用日期排序,对排在最后的员工的薪水求和。
+SELECT SUM(salary) KEEP (DENSE_RANK FIRST ORDER BY salary) "W", SUM(salary) KEEP (DENSE_RANK LAST ORDER BY hiredate) "B" FROM employees;
+ W | B
+------+-------
+ 1400 | 27500
+(1 row)
+--(2)分析函数示例
+--对于每个部门按照薪水排序,对排在第一的员工的薪水求和;按照雇用日期排序,对排在最后的员工的薪水求和。
+SELECT last_name,department_id,salary, SUM(salary) KEEP (DENSE_RANK FIRST ORDER BY salary) OVER (PARTITION BY department_id) "W", SUM(salary) KEEP (DENSE_RANK LAST ORDER BY hiredate) OVER (PARTITION BY department_id) "B" FROM employees ORDER BY department_id, salary, last_name;
+ last_name | department_id | salary | W | B
+-----------+---------------+--------+-------+-------
+ Raphaely | 30 | 1700 | 1700 | 11000
+ De Haan | 30 | 11000 | 1700 | 11000
+ Errazuriz | 40 | 1400 | 1400 | 1400
+ Raphaely | 50 | 1700 | 1700 | 27500
+ Weiss | 50 | 13500 | 1700 | 27500
+ Hartstein | 50 | 14000 | 1700 | 27500
+ Russell | 90 | 13000 | 13000 | 13000
+ Partners | 90 | 14000 | 13000 | 13000
+(8 rows)
+ ```
+
+
diff --git a/content/docs-lite/zh/docs/SQLReference/public_sys-resources/keep-first.png b/content/docs-lite/zh/docs/SQLReference/public_sys-resources/keep-first.png
new file mode 100755
index 0000000000000000000000000000000000000000..af1d19499bbf37df342a9d0678442a39212af30e
Binary files /dev/null and b/content/docs-lite/zh/docs/SQLReference/public_sys-resources/keep-first.png differ
diff --git a/content/docs-lite/zh/docs/SQLReference/public_sys-resources/keep-last.png b/content/docs-lite/zh/docs/SQLReference/public_sys-resources/keep-last.png
new file mode 100755
index 0000000000000000000000000000000000000000..ea9f04db277460008c60c3f4bf9df258c2315b8a
Binary files /dev/null and b/content/docs-lite/zh/docs/SQLReference/public_sys-resources/keep-last.png differ
diff --git a/content/docs-lite/zh/menu/index.md b/content/docs-lite/zh/menu/index.md
index 712139b5f93d432df69e4c9a8e18b213e4b60099..725a7338339f35b8c717d35ecf9b1004b3004649 100644
--- a/content/docs-lite/zh/menu/index.md
+++ b/content/docs-lite/zh/menu/index.md
@@ -1131,6 +1131,7 @@ headless: true
- [范围函数和操作符]({{< relref "./docs/SQLReference/范围函数和操作符.md" >}})
- [聚集函数]({{< relref "./docs/SQLReference/聚集函数.md" >}})
- [窗口函数]({{< relref "./docs/SQLReference/窗口函数.md" >}})
+ - [KEEP函数]({{< relref "./docs/SQLReference/KEEP函数.md" >}})
- [安全函数]({{< relref "./docs/SQLReference/安全函数.md" >}})
- [账本数据库的函数]({{< relref "./docs/SQLReference/账本数据库的函数.md" >}})
- [密态等值的函数]({{< relref "./docs/SQLReference/密态等值的函数.md" >}})
diff --git "a/content/zh/docs/SQLReference/KEEP\345\207\275\346\225\260.md" "b/content/zh/docs/SQLReference/KEEP\345\207\275\346\225\260.md"
new file mode 100755
index 0000000000000000000000000000000000000000..c239b0355d6de28560772a0c91a430f3dfafd143
--- /dev/null
+++ "b/content/zh/docs/SQLReference/KEEP\345\207\275\346\225\260.md"
@@ -0,0 +1,94 @@
+# KEEP函数
+
+## KEEP函数
+
+仅在openGauss数据库A模式下支持KEEP函数的使用,该函数用于对一组行中的值进行操作,将这组行按照指定的排序规则排序后返回排在第一或最后的值。可以将其用作聚合或分析函数。
+
+列存表目前暂不支持;
+
+该函数语法如下:
+aggregate_function KEEP ( DENSE_RANK { FIRST | LAST } ORDER BY expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ] [, expr [ DESC | ASC ] [ NULLS { FIRST | LAST } ]]...
+)[ OVER ( [query_partition_clause] ) ]
+
+
+
+
+
+参数说明:
+
+| 参数 | 解释说明 |
+|---------------------------|-------------------------------------------------------------------------------------------------------|
+| aggregate_function | 指定聚合函数的种类。 |
+| DENSE_RANK | 为各组内值生成连续排序序号,其中相同的值具有相同序号。 |
+| expr | 可以是任何表达式。 |
+| FIRST/LAST | 指定返回 expr 排序后那个位置的值。FIRST表示返回排在首位的值。LAST返回排在最后的值。 |
+| DESC/ASC | 指定列表的排序方式,为可选项。ASC为升序排序,默认值。DESC为降序排序。 |
+| NULLS { FIRST/LAST } | 排序后 expr 中 NULL 值的位置,为可选项。NULLS FIRST表示 NULL值排在非空值的前面。NULLS LAST表示NULL值排在非空值的后面,为默认值。 |
+| OVER | 使用 OVER 子句定义窗口进行计算。 |
+| query_partition_clause | 用于定义窗口函数的分区依据,指定对哪些列进行分组。数据会按这些列的值进行划分,每个分区内的数据会单独进行窗口计算。|
+
+keep函数支持的聚集函数列表:
+| 函数名称 | 描述 |
+|---------------|-------------------------------------------------------------|
+| min(expression) | 所有输入行中 expression 的最小值。 |
+| max(expression) | 所有输入行中 expression 的最大值。 |
+| sum(expression) | 所有输入行的 expression 总和。 |
+| avg(expression) | 所有输入值的均值(算术平均)。 |
+| count(expression) | 返回查询到的数据的数量。 |
+| stddev(expression) | stddev_samp 的别名,计算一组数值的样本标准差。 |
+| variance(expression) | var_samp 的别名,计算一组数值的样本方差。 |
+
+> **说明:**
+>
+>KEEP函数用于对一组行中的值进行操作,将这组行按照指定的排序规则排序后返回排在第一或最后的值。可以将其用作聚合或分析函数。
+
+
+- 示例
+ ```
+--创建表 employees,并向里面插入数据。
+
+create database db dbcompatibility 'A';
+CREATE DATABASE
+
+\c db
+Non-SSL connection (SSL connection is recommended when requiring high-security)
+You are now connected to database "db" as user "hmy".
+
+CREATE TABLE employees (department_id INT,manager_id INT,last_name varchar(50),hiredate varchar(50),SALARY INT);
+CREATE TABLE
+
+INSERT INTO employees VALUES
+(30, 100, 'Raphaely', '2017-07-01', 1700),
+(30, 100, 'De Haan', '2018-05-01',11000),
+(40, 100, 'Errazuriz', '2017-07-21', 1400),
+(50, 100, 'Hartstein', '2019-10-05',14000),
+(50, 100, 'Raphaely', '2017-07-22', 1700),
+(50, 100, 'Weiss', '2019-10-05',13500),
+(90, 100, 'Russell', '2019-07-11', 13000),
+(90,100, 'Partners', '2018-12-01',14000);
+INSERT 0 8
+
+--(1)聚合函数示例
+--按照薪水排序,对排在第一的员工的薪水求和;按照雇用日期排序,对排在最后的员工的薪水求和。
+SELECT SUM(salary) KEEP (DENSE_RANK FIRST ORDER BY salary) "W", SUM(salary) KEEP (DENSE_RANK LAST ORDER BY hiredate) "B" FROM employees;
+ W | B
+------+-------
+ 1400 | 27500
+(1 row)
+--(2)分析函数示例
+--对于每个部门按照薪水排序,对排在第一的员工的薪水求和;按照雇用日期排序,对排在最后的员工的薪水求和。
+SELECT last_name,department_id,salary, SUM(salary) KEEP (DENSE_RANK FIRST ORDER BY salary) OVER (PARTITION BY department_id) "W", SUM(salary) KEEP (DENSE_RANK LAST ORDER BY hiredate) OVER (PARTITION BY department_id) "B" FROM employees ORDER BY department_id, salary, last_name;
+ last_name | department_id | salary | W | B
+-----------+---------------+--------+-------+-------
+ Raphaely | 30 | 1700 | 1700 | 11000
+ De Haan | 30 | 11000 | 1700 | 11000
+ Errazuriz | 40 | 1400 | 1400 | 1400
+ Raphaely | 50 | 1700 | 1700 | 27500
+ Weiss | 50 | 13500 | 1700 | 27500
+ Hartstein | 50 | 14000 | 1700 | 27500
+ Russell | 90 | 13000 | 13000 | 13000
+ Partners | 90 | 14000 | 13000 | 13000
+(8 rows)
+ ```
+
+
diff --git a/content/zh/docs/SQLReference/public_sys-resources/keep-first.png b/content/zh/docs/SQLReference/public_sys-resources/keep-first.png
new file mode 100755
index 0000000000000000000000000000000000000000..af1d19499bbf37df342a9d0678442a39212af30e
Binary files /dev/null and b/content/zh/docs/SQLReference/public_sys-resources/keep-first.png differ
diff --git a/content/zh/docs/SQLReference/public_sys-resources/keep-last.png b/content/zh/docs/SQLReference/public_sys-resources/keep-last.png
new file mode 100755
index 0000000000000000000000000000000000000000..ea9f04db277460008c60c3f4bf9df258c2315b8a
Binary files /dev/null and b/content/zh/docs/SQLReference/public_sys-resources/keep-last.png differ
diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md
index 272a84c40a6a5ca175bd1269371e795fcacb0a9d..0001ba1a10ce678851d4ee549a735edab788d58f 100644
--- a/content/zh/menu/index.md
+++ b/content/zh/menu/index.md
@@ -1543,6 +1543,7 @@ headless: true
- [范围函数和操作符]({{< relref "./docs/SQLReference/范围函数和操作符.md" >}})
- [聚集函数]({{< relref "./docs/SQLReference/聚集函数.md" >}})
- [窗口函数]({{< relref "./docs/SQLReference/窗口函数.md" >}})
+ - [KEEP函数]({{< relref "./docs/SQLReference/KEEP函数.md" >}})
- [安全函数]({{< relref "./docs/SQLReference/安全函数.md" >}})
- [账本数据库的函数]({{< relref "./docs/SQLReference/账本数据库的函数.md" >}})
- [密态等值的函数]({{< relref "./docs/SQLReference/密态等值的函数.md" >}})