Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL窗口函数概述

SQL窗口函数概述

作者头像
用户7741497
发布于 2022-03-27 14:32:23
发布于 2022-03-27 14:32:23
2.5K10
代码可运行
举报
文章被收录于专栏:hml_知识记录hml_知识记录
运行总次数:0
代码可运行

SQL窗口函数概述

指定用于计算聚合和排名的每行“窗口框架”的函数。

窗口函数和聚合函数

在应用WHEREGROUP byHAVING子句之后,窗口函数对SELECT查询选择的行进行操作。

窗口函数将一组行中的一个(或多个)字段的值组合在一起,并在结果集中为生成的列中的每一行返回一个值。

虽然窗口函数与聚合函数类似,因为它们将多行结果组合在一起,但它们与聚合函数的不同之处在于,它们本身并不组合行。

窗函数的语法

窗口函数被指定为SELECT查询中的选择项。 窗口函数也可以在SELECT查询的ORDER BY子句中指定。

窗口函数执行与由PARTITION by子句、ORDER by子句和ROWS子句指定的逐行窗口相关的任务,并为每一行返回一个值。 这三个子句都是可选的,但是如果指定了,必须按照以下语法中的顺序指定:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window-function() OVER (
                      [ PARTITION BY partfield ]
                      [ ORDER BY orderfield ]
                      [ ROWS framestart ] | [ ROWS BETWEEN framestart AND frameend ]
                      )

其中framestartframeend可以是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UNBOUNDED PRECEDING |
offset PRECEDING |
CURRENT ROW |
UNBOUNDED FOLLOWING |
offset FOLLOWING
  • window-function:支持如下窗口函数:ROW_NUMBER()RANK()PERCENT_RANK()FIRST_VALUE(字段)SUM(字段)。 该字段在显示的地方是必需的,在没有显示的地方是不允许的。 括号对所有窗口函数都是必需的。
  • OVER: OVER关键字后面必须加上括号。 括号中的子句是可选的。
  • PARTITION BY partfield:一个可选子句,根据指定的partfield分区行。 Partfield可以是单个字段,也可以是用逗号分隔的字段列表。 partfield可以是聚合函数、标量函数(如LENGTH(Name)ROUND(Salary,-2)),或者表达式(如Salary+Bonus)。 部分字段不能是流字段; 尝试这样做会产生一个SQLCODE -37错误。 如果指定了PARTITION BY,必须在ORDER BY之前指定PARTITION BY

如果指定了一个PARTITION BY子句,行被分组在指定的窗口中,窗口函数创建一个新的结果集字段并为每一行分配一个值。 例如,PARTITION BY City将共享相同City字段值的所有行分组到同一个窗口中; 窗口函数根据这个分组分配行值。

  • ORDER BY orderfield:一个可选子句,根据指定的orderfield对行排序。 Orderfield可以是单个字段,也可以是用逗号分隔的字段列表。 订单字段可以是一个聚合函数,一个标量函数(例如LENGTH(Name)ROUND(Salary,-2)),或者一个表达式(例如Salary+Bonus)。 订单字段不能是流字段; 尝试这样做会产生一个SQLCODE -37错误。

ORDER BY按排序规则升序对窗口函数值进行排序。如果指定PARTITION BYORDER BY,则行将被分区为组,每个组的orderfield值将被排序,窗口函数将创建一个新的结果集字段并为每行赋值。如果在没有PARTITION BY子句的情况下指定ORDER BY子句,则所有选定的行将在单个窗口中分组、排序,然后赋值。例如,ORDER BY City根据City字段的值对所有行进行排序,然后Window函数按该顺序为每行赋值。

  • ROWS:具有两种支持的语法形式的可选子句:ROWSFRAME STARTROWS介于Frame StartFrameEnd之间。ROWS通过指定分区内的起始点和结束点(包括范围点),对分区内的连续行执行滚动操作。它需要一个ORDER BY子句来建立行序列。它可以选择性地指定PARTITION BY子句。如果未指定ROWS子句,则缺省值为从分区开始处(前面未绑定)到当前行。ROWS子句可以与first_value(Field)sum(Field)窗口函数一起使用。

简单的例子

CityTable包含具有以下值的行:

Name

City

Able

New York

Betty

Boston

Charlie

Paris

Davis

Boston

Eve

Paris

Francis

Paris

George

London

Beatrix

Paris

ROW_NUMBER()窗口函数根据指定的窗口为每一行分配一个唯一的连续整数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Name,City,ROW_NUMBER() OVER (PARTITION BY City) FROM CityTable

Name

City

Window_3

Able

New York

1

Betty

Boston

1

Charlie

Paris

1

Davis

Boston

2

Eve

Paris

2

Francis

Paris

3

George

London

1

Beatrix

Paris

4

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Name,City,ROW_NUMBER() OVER (ORDER BY City) FROM CityTable

本例将所有行视为单个分区。 它根据City值对行排序,并返回以下结果:

Name

City

Window_3

Able

New York

4

Betty

Boston

1

Charlie

Paris

5

Davis

Boston

2

Eve

Paris

6

Francis

Paris

7

George

London

3

Beatrix

Paris

8

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Name,City,ROW_NUMBER() OVER (Partition BY City ORDER BY Name) FROM CityTable

这个例子根据City值对行进行分区,根据Name值对每个City分区排序,并返回以下结果:

Name

City

Window_3

Able

New York

1

Betty

Boston

1

Charlie

Paris

2

Davis

Boston

2

Eve

Paris

3

Francis

Paris

4

George

London

1

Beatrix

Paris

1

NULL

PARTITION BY子句将字段为NULL(没有分配值)的行作为分区组处理。 例如,ROW_NUMBER() OVER (Partition BY City)会将没有City值的行分配为顺序整数,就像它将顺序整数分配给City值为'Paris'的行一样。

ORDER BY子句将字段为NULL(没有分配值)的行按照在任何分配值(具有最低的排序值)之前的顺序处理。 例如,ROW_NUMBER() OVER (ORDER BY City)首先将顺序整数分配给没有City值的行,然后将顺序整数分配给排序顺序中具有City值的行。

ROWS子句将NULL(没有赋值)的字段视为值为零。 例如,SUM(Scores) OVER (ORDER BY Scores ROWS 1 above)/2将分配0.00给所有没有分数值的行((0 + 0)/2),并通过将0加到它然后除以2来处理第一个分数值。

支持的窗口函数

支持以下窗口函数:

  • FIRST_VALUE(field)——将指定窗口中第一行(ROW_NUMBER()=1)的字段列的值赋给该窗口中的所有行。 例如:FIRST_VALUE(Country) OVER (PARTITION BY City)FIRST_VALUE()支持ROWS子句。 注意,NULL排序在所有值之前,所以如果第一行中的字段值是NULL,那么窗口中的所有行都将是NULL
  • PERCENT_RANK()——将排名百分比作为0到1(包括1)之间的小数分配给同一窗口中的每一行。 如果窗口函数字段的多个行包含相同的值,那么排名百分比可能包含重复的值。
  • RANK()——给同一窗口中的每一行分配一个排序整数,从1开始。 如果窗口函数字段的多个行包含相同的值,那么对整数的排序可以包含重复的值。
  • ROW_NUMBER()——为同一窗口中的每一行分配一个唯一的连续整数,从1开始。 如果多行窗口函数字段包含相同的值,则为每一行分配一个唯一的连续整数。
  • SUM(field)——将指定窗口中字段列值的和赋给该窗口中的所有行。

SUM既可以用作聚合函数,也可以用作窗口函数。 SUM()支持ROWS子句。

下面的例子比较了这些窗口函数中ORDER by子句返回的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT Name,City,ROW_NUMBER() OVER (ORDER BY City) AS RowNum,
  RANK() OVER (ORDER BY City) AS RankNum,
  PERCENT_RANK() OVER (ORDER BY City) AS RankPct
  FROM CityTable ORDER BY City

本例将所有行视为单个分区。 它根据City值对行排序,并返回以下结果:

Name

City

RowNum

RankNum

RankPct

Harriet

1

1

0

Betty

Boston

2

2

.1111111111111111111

Davis

Boston

3

2

.1111111111111111111

George

London

4

4

.3333333333333333333

Able

New York

5

5

.4444444444444444444

Charlie

Paris

6

6

.5555555555555555555

Eve

Paris

7

6

.5555555555555555555

Francis

Paris

8

6

.5555555555555555555

Beatrix

Paris

9

6

.5555555555555555555

Jackson

Rome

10

10

1

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
1
1
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
深入MySQL窗口函数:原理和应用
窗口函数(Window Functions)是SQL标准中的一个高级特性,它允许用户在不改变查询结果集行数的情况下,对每一行执行聚合计算或其他复杂的计算。这些计算是基于当前行与结果集中其他行之间的关系进行的。窗口函数特别适用于需要执行跨多行的计算,同时又想保持原始查询结果集的行数不变的场景。
公众号:码到三十五
2024/03/19
2.9K0
深入MySQL窗口函数:原理和应用
postgreSQL窗口函数总结
1、我们都知道在SQL中有一类函数叫做聚合函数,例如sum()、avg()、max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的,但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数。
小徐
2020/02/16
2.8K0
postgreSQL窗口函数总结
Hive 窗口函数最全讲解和实战
在深入研究Over字句之前,一定要注意:在SQL处理中,窗口函数都是最后一步执行,而且仅位于Order by子句之前 可以想象成sql的输出结果,就是窗口函数输入的结果。
kk大数据
2019/12/18
2.1K0
Hive SQL 大厂必考常用窗口函数及相关面试题
二、窗口函数的基本用法 1.基本语法 2.设置窗口的方法 1)window_name 2)partition by 子句 3) order by子句 4)rows 指定窗口大小 3.开窗函数中加order by 和 不加 order by的区别
王知无-import_bigdata
2022/11/11
3.8K0
Hive SQL 大厂必考常用窗口函数及相关面试题
SQL数据分析实战:好用的窗口函数
感觉这个春节假期在除夕过完之后吧,时间就过的非常快了,余额已经明显不足了。嗯,是开始可以学习起来了!
可以叫我才哥
2022/04/12
7860
SQL数据分析实战:好用的窗口函数
MySQL8新特性窗口函数详解
本文博主给大家详细讲解一波 MySQL8 的新特性:「窗口函数」,相信大伙看完一定能有所收获。
wayn
2023/06/14
4790
MySQL8新特性窗口函数详解
SQL 窗口函数的优化和执行
窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
SQL数据库开发
2024/04/24
2280
SQL 窗口函数的优化和执行
SQL 窗口函数的优化和执行
窗口函数(Window Function)是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
大数据老哥
2021/03/08
1.9K0
SQL 窗口函数的优化和执行
大数据快速入门(10):Hive窗口函数
首先,需要认识到,窗口函数并不是只有 hive 才有的,SQL 语法标准中,就有窗口函数。
kk大数据
2020/11/11
2.6K0
MySQL8新特性窗口函数详解
MySQL8 窗口函数是一种特殊的函数,它可以在一组查询行上执行类似于聚合的操作,但是不会将查询行折叠为单个输出行,而是为每个查询行生成一个结果。窗口函数可以用来处理复杂的报表统计分析场景,例如计算移动平均值、累计和、排名等。其中博主认为它展现的主要威力在于「它能够让我们在不修改原有语句输出结果的基础上,直接添加新的聚合字段」。
wayn
2023/08/28
3050
MySQL8新特性窗口函数详解
数据库:SQL 窗口函数知识介绍
窗口函数(Window Function) 是 SQL2003 标准中定义的一项新特性,并在 SQL2011、SQL2016 中又加以完善,添加了若干处拓展。窗口函数不同于我们熟悉的普通函数和聚合函数,它为每行数据进行一次计算:输入多行(一个窗口)、返回一个值。在报表等分析型查询中,窗口函数能优雅地表达某些需求,发挥不可替代的作用。
小明互联网技术分享社区
2021/05/14
7560
数据库:SQL 窗口函数知识介绍
SparkSql窗口函数源码分析(第一部分)
WindowExpression :描述该expression是一个windowExpression,继承BinaryLike,是一个二元树。
数据仓库践行者
2022/11/25
1.2K0
SparkSql窗口函数源码分析(第一部分)
MySQL窗口函数,你最熟悉的陌生人~
  这三个点虽然平时用得少,但在面试中却常被问到。值得一提的是,很多面试官对问题竟然也是一知半解。。
陈哈哈
2021/12/31
1.1K0
MySQL窗口函数,你最熟悉的陌生人~
MySQL窗口函数怎么用
在 MySQL 8.x 版本中,MySQL 提供了窗口函数,窗口函数是一种在查询结果的特定窗口范围内进行计算的函数。
科技新语
2024/05/17
3050
SQL干货 | 窗口函数的使用
Mysql从8.0版本开始,也和Sql Server、Oracle一样支持在查询中使用窗口函数,本文将根据官方文档,通过实例介绍窗口函数并举例分组排序函数的使用。
Python数据科学
2019/12/31
1.5K0
SQL干货 | 窗口函数的使用
MySQL窗口函数简介「建议收藏」
原文地址:https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_last-value
全栈程序员站长
2022/11/10
1.4K0
这些SQL排名及分析函数,你知道吗?(5)
SQL的排名函数主要有ROW_NUMBER(), RANK(), 和 DENSE_RANK(),它们分别返回行号、排名和紧密排名。这三个函数的区别在于处理并列排名的方式。
万能数据的小草
2024/07/23
2610
这些SQL排名及分析函数,你知道吗?(5)
mysql命令窗口_HLOOKUP函数
窗口:记录集合 窗口函数:在满足某些条件的记录集合上执行的特殊函数,对于每条记录都要在此窗口内执行函数。有的函数随着记录的不同,窗口大小都是固定的,称为静态窗口;有的函数则相反,不同的记录对应着不同的窗口,称为滑动窗口。
全栈程序员站长
2022/11/09
2.2K0
mysql命令窗口_HLOOKUP函数
玩转SQL窗口函数
DENSE_RANK() 函数用来表示排名,与RANK()不同的是,DENSE_RANK() 不会出现空缺数字。比如,如果出现了两个并列的1,DENSE_RANK() 的第三个数仍然是2,而RANK()的第三个数是3。
闫同学
2023/10/10
2850
Hive常用窗口函数实战
本文介绍了Hive常见的序列函数,排名函数和窗口函数。结合业务场景展示了Hive分析函数的使用
Eights
2020/07/13
2.8K0
相关推荐
深入MySQL窗口函数:原理和应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验