继续创作,加快成长!这是我参加「日新计划 · 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)。

未完待续..已然看到这儿了,不妨来个大大的点赞吧[送心]