开窗函数

开窗函数也属于分析函数,与聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。

格式:函数名(列)over(选项)

OVER 关键字表示把函数当成开窗函数而不是聚合函数。SQL 标准允许将所有聚合函数用做开窗函数,使用 OVER 关键字来区分这两种用法。

OVER 关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围。如果 OVER 关键字后的括号中的选项为空,则开窗函数会对结果集中的所有行进行聚合运算。

PARTITION BY 子句:

开窗函数的 OVER 关键字后括号中的可以使用 PARTITION BY 子句来定义行的分区来供进行聚合计算。与 GROUP BY 子句不同,PARTITION BY 子句创建的分区是独立于结果集的,创建的分区只是供进行聚合计算的,而且不同的开窗函数所创建的分区也不互相影响。

ORDER BY子句:

开窗函数中可以在OVER关键字后的选项中使用ORDER BY子句来指定排序规则,而且有的开窗函数还要求必须指定排序规则。使用ORDER BY子句可以对结果集按照指定的排序规则进行排序,并且在一个指定的范围内进行聚合运算。

语法:ORDERBY字段名 RANGE|ROWSBETWEEN边界规则1AND边界规则2

注意:PARTITION BY子句和ORDER BY 可以共同使用,从而可以实现更加复杂的功能


新建临时表

CREATETABLET_Person (FNameVARCHAR(40),FCityVARCHAR(40),FAge INT,FSalaryINT);


插入数据:

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Tom','BeiJing',20,3000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Tim','ChengDu',21,4000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Jim','BeiJing',22,3500);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Lily','London',21,2000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('John','NewYork',22,1000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('YaoMing','BeiJing',20,3000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Swing','London',22,2000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Guo','NewYork',20,2800);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('YuQian','BeiJing',24,8000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Ketty','London',25,8500);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Kitty','ChengDu',25,3000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Merry','BeiJing',23,3500);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Smith','ChengDu',30,3000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Bill','BeiJing',25,2000);

INSERT INTO xiaoxiao.T_Person(FName,FCity,FAge,FSalary)

VALUES('Jerry','NewYork',24,3300);


(1)row_number() 函数语法:

语法:ROW_NUMBER() OVER(PARTITIONBYCOL1ORDERBY COL2)

功能:表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)row_number() 返回的主要是“行”的信息,并没有排名

例如:

SELECT FName, FSalary,FAge,

ROW_NUMBER() OVER(ORDER BY fsalary desc) id

FROM T_Person;

结果:



(2)rank()

语法:RANK ( ) OVER([query_partition_clause] order_by_clause )

功能:rank()是跳跃排序,有两个第二名时接下来就是第四名。

例如:

SELECT FNAME, FSALARY,FAGE,

RANK() OVER(ORDER BY FSALARY DESC) RANK_ID

FROM T_PERSON;

结果:



(3)dense_rank()语法

语法:dense_RANK ( ) OVER([query_partition_clause] order_by_clause )

功能:dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。

例如:

SELECT FName, FSalary,FAge,

DENSE_RANK() OVER(ORDER BY fsalary desc) DENSE_RANK_ID

FROM T_Person;

结果:



(4)分组排序累积求和

语法:SUM(列名2)OVER(PARTITION BY 列1 ORDER BY 列2)

注意:row可以换成range,是按照范围进行定位的

栗子:sum(列2 ) over (PARTITION BY 列1  order by 列2 range between unbounded preceding and current row) 

例如:

SELECT FNAME,

      FCITY,

      FAGE,

      FSALARY,

      SUM(FSALARY) OVER(PARTITION BY fage ORDER BY FSALARY) FSALARY_SUM

  FROM T_PERSON

结果:


释义:按照fage 分组,FSALARY列累积求和,ORDER BY FSALARY,假如FSALARY一样,需要同时累积求和,类似第1、2、3行。


(5)按列统计个数

语法:COUNT(*) OVER (ORDER BY 列 desc)

功能:按照列统计统计个数,并且降序排列,注意后面的个数是排序累积个数。

例如:

select distinct fcity,

COUNT(*) OVER (ORDER BY fcity desc)

from T_Person

结果:


释义:NewYork 统计个数为3个,London有3个,由于是统计个数累积求和,所以后面的个数是6,以此类推。


(6)max求到目前行的最大值

语法:MAX(列2)OVER(PARTITION BY 列1 ORDERBY 列2)

功能:按列1分组求列2的最大值,并且按照 列2排序

例如:

SELECT fname,fcity,FSalary,

MAX(FSalary) OVER(PARTITION BY fcity order by fsalary desc) 同城薪资最高

FROM T_Person;

结果:



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 1. 介绍 普通聚合函数聚合的行集是组,开窗函数聚合的行集是窗口。因此,普通聚合函数每组(Group by)只有一...
    Yobhel阅读 561评论 0 2
  • 碎语 学习的正态曲线:入门容易,精通难 积累的正态曲线:先越读越多,后越读越少 什么是开窗函数 很多场景比如排序,...
    数有道阅读 1,047评论 5 3
  • 开窗函数简介 与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函...
    overad阅读 4,583评论 0 1
  • 一 . 开窗函数 分组函数 开窗函数 分组与开窗的区别分组函数每组只返回一行,而开窗函数每组返回多行。如下: 分组...
    文字抒意阅读 3,947评论 0 4
  • 1.开窗函数over partition 开窗函数使用于取出多列分组,取一列分组下另一组前几名,先利用开窗函数对其...
    enjoy_muming阅读 2,711评论 1 3