继续创作,加快成长!这是我参加「日新计划 · 10 月更文应战」的第31天,点击查看活动概况
🗻 简介:
往期精选文章,精彩不容错过,求赞求重视!
🤣一文带你玩转Kubernetes🤣
Proxy 署理的源码和原了解析
Spring + LDAP + JPA 实现业务管理器
容器服务Istio实践 Istio Sidecar 注入方法
Java EasyPoi之复杂多表头多sheet页excel模板导出实例
🗺️ PG系列文章:
PG系列文章,想学习更多PG芝士,快来吧🦸🏻♂️!
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🔥 (一)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🍭(二)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🍌 (三)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🎵(四)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL✒️(五)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🔬(六)
[千字长文系列] 🌏探秘PG之一文带你玩转PostgreSQL🐳(七)
本文用到的emoji:🦄🧚♀️🧚🏻♀️🧚🏻♂️
🚏简介: 在本文中,咱们将学习如何运用PostgreSQL的窗口函数来执行与当时行相关的一组行的核算。
📋🚂🚄🚅🚏
Window Functions 概览
思维导图
表格总结:
Name | 阐明 |
---|---|
CUME_DIST | 回来当时行的相对排名。 |
DENSE_RANK | 在其分区中对当时行进行无空隙排名。 |
FIRST_VALUE | 回来一个针对其分区中榜首行的核算值。 |
LAG | 回来一个在分区内当时行之前的指定物理偏移行的核算值。 |
LAST_VALUE | 回来一个针对其分区中最终一行的核算值。 |
LEAD | 回来一个在该行核算的值,该行的偏移量为 |
NTILE | 在分区中的当时行之后的行的值。 |
NTH_VALUE | 尽可能平均分配分区中的行,并给每行分配一个整数,从1开端到参数值。 |
PERCENT_RANK | 回来一个针对有序分区中第n行的核算值。 |
RANK | 回来当时行的相对排名(rank-1)/(总行-1)。 |
ROW_NUMBER | 对当时行在其分区中的空隙进行排序。 |
🚂PostgreSQL CUME_DIST 函数
🚏简介: 在本节中,咱们将学习CUME_DIST()
函数来核算一个数值在一组数值中的累积散布。
🚄语法
下面阐明CUME_DIST()
函数的语法:
CUME_DIST() OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
🚄入参
CUME_DIST()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY 子句对函数每个分区中的行进行排序。
🚄回来值
CUME_DIST()
函数回来大于0且小于或等于1的双精度值:
0 < CUME_DIST() <= 1
🚄示例
以下是运用CUME_DIST()
函数的示例:
首要,创立新表命名pro_rank
存储选手的排位分数核算:
CREATE TABLE pro_rank (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
team CHAR(1) NOT NULL,
line VARCHAR(20) NOT NULL,
rank INT NOT NULL
);
第二,将一些行刺进 pro_rank
表:
INSERT INTO
pro_rank(name, team, line,rank)
VALUES
('369','JDG','Top',3699),
('Kanavi','JDG','Jug',3700),
('Yagao','JDG','Mid',3666),
('Hope','JDG','Adc',2222),
('Missing','JDG','Sup',3333),
('Bin','BLG','Top',3500),
('Ning','NULL','Jug',0),
('Cream','OMG','Mid',2200),
('Light','LNG','Adc',2500),
('Hang','WBG','Sup',-2000);
以下示例可协助咱们更好地了解CUME_DIST()
函数。
🚅1) 运用PostgreSQLCUME_DIST()
函数累积散布示例
以下示例:
SELECT
name,
team,
rank,
CUME_DIST() OVER (
ORDER BY rank
)
FROM
pro_rank
WHERE
team = 'JDG';
输出如下
如上图中展示的,咱们能够发现,JDG战队,有80% 的选手的rank分高于3K。
🚅2) 运用PostgreSQLCUME_DIST()
函数分区示例
以下示例运用CUME_DIST()
函数核算每个战队每名工作选手rank分百分比。
SELECT
name,
team,
rank,
CUME_DIST() OVER (
PARTITION BY team
ORDER BY rank
)
FROM
pro_rank;
以下是输出
在此示例中:
-
PARTITION BY
子句将按队伍把行分为n个分区。 -
ORDER BY
子句对每个分区中每名选手的rank分从低到高进行了排序。
🚄补白
CUME_DIST()
函数回来当时行的累积散布,即从榜首行到与当时行值相同的最终一行的行数在分区内的总行数中的占比。
CUME_DIST()
函数常用于显现一个记载会集最高或许最低百分比数量的记载。比如,全国收入的前 10% 的人、此次考试最终 5% 的学生等。
🚂PostgreSQL DENSE_RANK 函数
🚏简介: 在本节中,咱们将学习DENSE_RANK()
函数,函数为成果集的分区中的每一条记载分配一个等级,并且等级值没有距离。
🚄语法
下面阐明DENSE_RANK()
函数的语法:
DENSE_RANK() OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
🚄入参
DENSE_RANK()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY 子句对函数每个分区中的行进行排序。
🚄回来值
DENSE_RANK()
函数回来函数回来当时行地点的分区内的排名,从 1 开端,但没有距离。
🚄示例
以下是运用DENSE_RANK()
函数的示例:
首要,创立表命名dense_ranks
有一列:
CREATE TABLE dense_ranks (
c VARCHAR(10)
);
第二,刺进一些行到dense_ranks
表:
INSERT INTO dense_ranks(c)
VALUES('A'),('A'),('B'),('C'),('C'),('D'),('E');
第三,从dense_ranks
表查询数据:
SELECT c from dense_ranks;
输出如下:
接下来,让咱们凭借数据库示例来更好的学习DENSE_RANK()
函数
首要,创立新表命名pro_rank
存储选手的排位分数核算:
CREATE TABLE pro_rank (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
team CHAR(1) NOT NULL,
line VARCHAR(20) NOT NULL,
rank INT NOT NULL
);
第二,将一些行刺进 pro_rank
表:
INSERT INTO
pro_rank(name, team, line,rank)
VALUES
('369','JDG','Top',3699),
('Kanavi','JDG','Jug',3700),
('Yagao','JDG','Mid',3666),
('Hope','JDG','Adc',2222),
('Missing','JDG','Sup',3333),
('Bin','BLG','Top',3500),
('Ning','NULL','Jug',0),
('Cream','OMG','Mid',2200),
('Light','LNG','Adc',2500),
('Hang','WBG','Sup',-2000);
以下示例可协助咱们更好地了解DENSE_RANK()
函数。
1) 运用PostgreSQLDENSE_RANK()
函数分区排名示例
此句子运用DENSE_RANK()
按rank分对选手进行排名:
SELECT
id,
name,
rank,
DENSE_RANK () OVER (
ORDER BY rank DESC
) pro_rank
FROM
pro_rank;
输出如下:
在此示例中,咱们跳过了PARTITION BY
因此,DENSE_RANK()
函数将整个成果集视为单个分区。
2) 运用PostgreSQLDENSE_RANK()
分区函数示例
以下示例运用DENSE_RANK()
函数核算每个战队每名工作选手rank排名。
SELECT
id,
name,
team,
rank,
DENSE_RANK () OVER (
PARTITION BY team
ORDER BY rank DESC
) pro_rank
FROM
pro_rank;
输出如下图所示:
在此示例中,DENSE_RANK()
函数运用PARTITION BY
子句将战队到组中。ORDER BY
子句按ran从高到低对每组工作选手进行排名。
3) 运用PostgreSQLDENSE_RANK()
函数和CTE的示例
以下句子运用DENSE_RANK()
运用CTE回来每个战队中rank分最高的选手:
WITH cte AS(
SELECT
id,
name,
team,
rank,
DENSE_RANK () OVER (
PARTITION BY team
ORDER BY rank DESC
) pro_rank
FROM
pro_rank
)
SELECT
id,
name,
rank
FROM
cte
WHERE
pro_rank = 1;
输出如下
🚄补白
DENSE_RANK()
函数为成果集的分区中的每一条记载分配一个等级,并且等级值没有距离。关于每个分区,DENSE_RANK()
函数为具有相同值的行回来相同的等级。
🚂PostgreSQL FIRST_VALUE 函数
🚏简介: 在本节中,咱们将学习FIRST_VALUE()
函数来回来一个成果集的分类分区中的榜首个值。
🚄语法
下面阐明FIRST_VALUE()
函数的语法:
FIRST_VALUE ( expression )
OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
🚄入参
FIRST_VALUE()
函数有3个入参:
expression
有必要参数。它能够是一个列名或许表达式。
partition_column_list
参加分区的列的列表。
order_column_list
参加排序的列的列表。
FIRST_VALUE()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY
子句对函数每个分区中的行进行排序。
ORDER BY
子句
ORDER BY
子句对FIRST_VALUE()
函数每个分区中的行进行排序。
🚄回来值
FIRST_VALUE()
函数回来从当时行相关的成果集的榜首行中回来评价的值
🚄示例
以下是运用FIRST_VALUE()
函数的示例:
接下来,让咱们凭借数据库示例来更好的学习FIRST_VALUE()
函数
首要,创立新表命名pro_rank
存储选手的排位分数核算:
CREATE TABLE pro_rank (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
team CHAR(1) NOT NULL,
line VARCHAR(20) NOT NULL,
rank INT NOT NULL
);
第二,将一些行刺进 pro_rank
表:
INSERT INTO
pro_rank(name, team, line,rank)
VALUES
('369','JDG','Top',3699),
('Kanavi','JDG','Jug',3700),
('Yagao','JDG','Mid',3666),
('Hope','JDG','Adc',2222),
('Missing','JDG','Sup',3333),
('Bin','BLG','Top',3500),
('Ning','NULL','Jug',0),
('Cream','OMG','Mid',2200),
('Light','LNG','Adc',2500),
('Hang','WBG','Sup',-2000);
以下示例可协助咱们更好地了解FIRST_VALUE()
函数:
🚅1) 运用PostgreSQLFIRST_VALUE()
函数成果集上的示例
以下句子运用FIRST_VALUE()
功用查询rank分最低的选手
SELECT
id,
name,
team,
rank,
FIRST_VALUE(name)
OVER(
ORDER BY rank
) lowest_pro
FROM
pro_rank;
输出如下:
在此示例中:
-
因为咱们跳过了
FIRST_VALUE()
函数中的PARTITION BY
子句,该函数将整个成果集视为单个分区。 -
ORDER BY
子句按rank从低到高对选手进行分类。 -
FIRST_VALUE()
函数运用于整个成果集,并回来 name 榜首行的列.
🚅2) 运用FIRST_VALUE()
分区函数示例
此句子运用FIRST_VALUE()
函数回来按战队分组的一切选手。关于每个战队,它回来rank最低的选手:
SELECT
id,
name,
team,
rank,
FIRST_VALUE(name)
OVER(
PARTITION BY team
ORDER BY rank
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) team_lowest_pro
FROM
pro_rank;
输出如下:
在此示例中:
-
PARTITION BY
子句按战队分配选手。 -
ORDER BY
子句按rank从低到高对每个战队 (分区) 中的选手进行排序。 -
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
子句界说每个分区中的帧,从榜首行开端,到最终一行完毕。 -
FIRST_VALUE()
函数别离运用于每个分区.
🚂PostgreSQL LAG函数
🚏简介: 在本节中,咱们将学习LAG()
函数回来来自当时行地点的分区内当时行之前的指定行之内的行的值.
🚄语法
下面阐明LAG()
函数的语法:
LAG(expression [,offset [,default_value]])
OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
🚄入参
LAG()
函数有5个入参:
expr
必需的。它能够是一个列名或许表达式。
offset
可选的。相关于当时行的偏移的行数。默认值为 1。
default
可选的。它能够是一个列名或许表达式。
partition_column_list
参加分区的列的列表。
order_column_list
参加排序的列的列表。
LAG()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY
子句对函数每个分区中的行进行排序。
🚄回来值
LAG()
函数回来来自当时行地点的分区内当时行之前的指定行之内的行的值
🚄示例
以下是运用LAG()
函数的示例:
🚅1) 运用PostgreSQLLAG()
成果集上的函数示例
此示例运用LAG()
回来各个战队的选手总rank的函数:
WITH cte AS (
SELECT
team,
SUM(rank) rank
FROM pro_rank
GROUP BY team
)
SELECT
team,
rank,
LAG(rank,1) OVER (
ORDER BY team
) team_pro_rank
FROM
cte;
输出如下
在此示例中:
-
首要,CTE回来按战队分组的总rank分。
-
然后,外部查询运用
LAG()
函数回来战队rank总分。榜首行在team_pro_rank列,因为榜首行没有上一年。
此示例运用两个公共表表达式来回来当时战队和前几个战队之间的rank总分差异:
WITH cte AS (
SELECT
team,
SUM(rank) rankall
FROM pro_rank
GROUP BY team
), cte2 AS (
SELECT
team,
rank,
LAG(rank,1) OVER (
ORDER BY team
) team_pro_teams
FROM
cte
)
SELECT
team,
rank,
team_pro_teams,
(team_pro_teams - rank) variance
FROM
cte2;
🚅2) 运用PostgreSQLLAG()
分区函数示例
此示例运用LAG()
函数将 当时战队的rank分与每个战队rank进行比较:
SELECT
team,
rank,
group_id,
LAG(amount,1) OVER (
PARTITION BY group_id
ORDER BY year
) previous_team_ranks
FROM
pro_rank;
输出如下:
在此示例中:
-
PARTITION BY
子句将战队分组。 -
ORDER BY
子句对战队成员进行排序。 -
LAG()
函数运用于每个分区以回来上一战队成员选手的rank。
🚄补白
PostgreSQL的LAG()
函数提供对当时行之前的指定物理偏移的行的拜访。换句话说,从当时行开端,LAG()
函数能够拜访前一行的数据,或许前一行之前的数据,以此类推。
🚏LAG()
函数关于比较当时行和前一行的值将十分有用。
🚂PostgreSQL LAST_VALUE 函数
🚏简介: 在本节中,咱们将学习LAST_VALUE()
函数
🚄语法
下面阐明LAST_VALUE()
函数的语法:
LAST_VALUE ( expression )
OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
🚄入参
LAST_VALUE()
函数有3个入参:
expr
必需的。它能够是一个列名或许表达式。
partition_column_list
参加分区的列的列表。
order_column_list
参加排序的列的列表。
LAST_VALUE()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY
子句对函数每个分区中的行进行排序。
🚄回来值
LAST_VALUE()
函数从当时行成果集的最终一行中回来评价的值。
🚄示例
以下是运用LAST_VALUE()
函数的示例:
🚅1) 运用PostgreSQLLAST_VALUE()
成果集示例
以下示例运用LAST_VALUE()
查询一切选手rank分,和最高rank分选手姓名:
SELECT
id,
name,
rank,
LAST_VALUE(name)
OVER(
ORDER BY rank
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) highest_rank
FROM
pro_rank;
在此示例中:
-
咱们跳过了
LAST_VALUE()
函数中的PARTITION BY
子句,因此,LAST_VALUE()
函数将整个成果集视为单个分区。 -
ORDER BY
子句按rank从低到高对选手进行分类。 -
LAST_VALUE()
选择成果会集最终一行的rank分。
🚅2) 运用PostgreSQLLAST_VALUE()
分区示例
以下示例运用LAST_VALUE()
回来一切战队以及每个战队中rank最高选手的功用:
SELECT
id,
name,
team,
rank,
LAST_VALUE(name)
OVER(
PARTITION BY team
ORDER BY rank
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) highest_rank
FROM
pro_rank;
输出如下
在此示例中:
-
PARTITION BY
子句按战队将数据分区。 -
ORDER BY
子句将每个战队(或分区) 中的选手按rank分从低到高排序。 -
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
子句界说了从榜首行开端到每个分区的最终一行完毕的最小单位。 -
LAST_VALUE()
函数别离运用于每个分区,并回来每个分区中最终一行的数据。
🚂PostgreSQL LEAD 函数
🚏简介: 在本节中,咱们将学习LEAD()
函数对当时行之后的指定物理偏移的行的拜访。
🚄语法
下面阐明LEAD()
函数的语法:
LEAD(expression[, offset[, default_value]])
OVER (
[PARTITION BY partition_column_list]
[ORDER BY order_column_list]
)
🚄入参
LEAD()
函数有5个入参:
expression
必需的。它能够是一个列名或许表达式。
offset
可选的。相关于当时行的偏移的行数。默认值为 1。
default _value
可选的。它能够是一个列名或许表达式。
partition_column_list
参加分区的列的列表。
order_column_list
参加排序的列的列表。
LEAD()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY
子句对函数每个分区中的行进行排序。
🚄回来值
LEAD()
函数回来
🚄示例
以下是运用LEAD()
函数的示例:
🚅1) 运用PostgreSQL LEAD()
成果集示例
以下查询按战队回来总rank:
SELECT
team,
SUM(rank)
FROM pro_rank
GROUP BY team
ORDER BY sum desc;
WITH cte AS (
SELECT
team,
SUM(rank)
FROM pro_rank
GROUP BY team
ORDER BY sum desc
)
SELECT
team,
sum,
LEAD(sum,1) OVER (
ORDER BY sum desc
) next_team_ranks
FROM
cte;
输出如下
在此示例中:
-
首要,CTE回来按战队汇总的rank。
-
然后,外部查询运用
LEAD()
函数回来下一战队每一行的rank。
以下示例运用两个公共表表达式回来当时战队和下一战队之间的rank差异:
WITH cte AS (
SELECT
team,
SUM(rank)
FROM pro_rank
GROUP BY team
ORDER BY sum desc
), cte2 AS (
SELECT
team,
sum,
LEAD(sum,1) OVER (
ORDER BY team
) next_team_ranks
FROM
cte
ORDER BY sum desc
)
SELECT
team,
sum,
next_team_ranks,
(next_team_ranks - sum) variance
FROM
cte2
;
🚅2) 运用PostgreSQL LEAD()
分区示例
以下句子运用 LEAD()
函数将每个战队的当时rank与下一战队的rank进行比较:
SELECT
team,
rank,
LEAD(rank,1) OVER (
PARTITION BY team
ORDER BY rank
) next_team_ranks
FROM
pro_rank;
下图展示输出:
在此示例中:
-
PARTITION BY
子句将行分配到战队指定的产品组 (或分区) 中。 -
ORDER BY
子句把战队按rank升序对每个战队组中的行进行排序。 -
LEAD()
函数回来每个分区的下一个行数据,假如没有,则回来null
。
🚄补白
PostgreSQL的LEAD()函数提供了对当时行之后的指定物理偏移的行的拜访。
这意味着从当时行开端,LEAD()函数能够拜访下一行的数据,下一行之后的行,等等。
LEAD()函数关于比较当时行的值和当时行之后的行的值十分有用。
🚂PostgreSQL NTILE函数
🚏简介: 在本节中,咱们将学习NTILE()
函数
🚄语法
下面阐明NTILE()
函数的语法:
NTILE(buckets)
OVER (
[PARTITION BY partition_column_list]
[ORDER BY order_column_list [ASC | DESC]]
)
🚄入参
NTILE()
函数有3个入参:
-
buckets
必需的。桶的数量。桶的数量最大为此分区内的行的数量。 -
partition_column_list
参加分区的列的列表。 -
order_column_list
参加排序的列的列表。
NTILE()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY
子句对函数每个分区中的行进行排序。
🚄回来值
NTILE()
函数将当时行地点的分区内的一切行尽可能平均的分红指定数量的排名桶,并回来当时行地点的桶的排名。
🚄示例
以下是运用NTILE()
函数的示例:
🚅1) 运用PostgreSQL NTILE()
成果集示例
此示例运用NTILE()
函数将行分配到3个存储桶中:
SELECT
team,
rank,
NTILE(3) OVER(
ORDER BY rank
)
FROM
pro_rank
WHERE
team = 'JDG';
输出如下:
🚅2) 运用PostgreSQL NTILE()
分区示例
此示例运用NTILE()
功用划分行pro_rank
表分为两个分区,每个分区3个存储桶:
SELECT
team,
rank,
NTILE(3) OVER(
PARTITION BY team
ORDER BY rank
)
FROM
pro_rank;
输出如下:
🚄补白
PostgreSQL的NTILE()
函数答应你将分区中的有序记载划分为指定数量的排序组,其大小尽可能持平。这些排序的组被称为桶。
NTILE()
函数给每个组分配一个从1开端的桶号,关于一个组中的每一条记载,NTILE()
函数分配一个桶号,代表该记载所属的组。
🚂PostgreSQL NTH_VALUE 函数
🚏简介: 在本节中,咱们将学习NTH_VALUE()
函数
🚄语法
下面阐明NTH_VALUE()
函数的语法:
NTH_VALUE(expression, offset)
OVER (
[PARTITION BY partition_column_list]
[ ORDER BY order_column_list [ASC | DESC]
frame_clause ]
)
🚄入参
NTH_VALUE()
函数有4个入参:
-
expression
必需的。它能够是一个列名或许表达式。 -
offset
必需的。指定行的编号。 -
partition_column_list
参加分区的列的列表。 order_column_list
参加排序的列的列表。
frame_clause
界说了当时分区的子集(或成果集)。
NTH_VALUE()
函数有2个子句:
PARTITION BY
PARTITION BY
子句按行划分为多个运用函数的分区。
PARTITION BY
子句是可选的。假如你不运用它,函数会将整个成果集视为单个分区。
ORDER BY
ORDER BY
子句对函数每个分区中的行进行排序。
🚄回来值
NTH_VALUE()
函数从一个成果集的有序分区中的第n行回来一个值。
🚄示例
以下是运用NTH_VALUE()
函数的示例:
🚅1) 运用PostgreSQL NTH_VALUE()
成果集示例
此示例运用NTH_VALUE()
将一切选手与第二高分选手一同回来的查询:
SELECT
id,
name,
team,
rank,
NTH_VALUE(name, 2)
OVER(
ORDER BY rank DESC
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
)
FROM
pro_rank;
输出如下:
在此示例中:
-
ORDER BY
子句按rank从高到低对一切选手进行排序 -
frame
子句界说的帧从成果集的开端行开端,到完毕行完毕。 -
NTH_VALUE()
函数在排序和帧后回来成果集第二行的name列中的值。
🚅2) 运用PostgreSQL NTH_VALUE()
分区示例
此示例运用NTH_VALUE()
回来每个战队中第二高rank选手和一切选手的功用:
SELECT
product_id,
product_name,
price,
group_id,
NTH_VALUE(product_name, 2)
OVER(
PARTITION BY group_id
ORDER BY price DESC
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
)
FROM
products;
输出如下:
在此示例中:
-
PARTITION BY
子句将选手分发到每个战队。 -
ORDER BY
子句按rank从高到低对一切选手进行排序 -
frame
子句将每个分区界说为成果集。 -
NTH_VALUE()
函数回来每个战队的第二行的选手名称。
🚄补白
nth_value(expr, 1)
等效于 first_value(expr)。