MySQL——开窗函数

MySQL——开窗函数

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

SQL标准允许将所有聚合函数用作开窗函数,使用over关键字来区分这两种用法。

PARTITION BY 子句

与group by子句不同,partition by子句创建的分区是独立于结果集的,partition by创建的分区只是供进行聚合运算的。

--显示每一个人员的信息以及所属城市的人员数
select fname,fcity,fage,fsalary,
count(*) over(partition by fcity) 所在城市人数 from t_person

在同一个SELECT语句中可以同时使用多个开窗函数,而且这些开窗函数并不会相互干扰。比如下面的SQL语句用于显示每一个人员的信息、所属城市的人员数以及同龄人的人数:

--显示每一个人员的信息、所属城市的人员数以及同龄人的人数:
select fname,
       fcity,
       fage,
       fsalary,
       count(*) over(partition by fcity) 所属城市的人个数,
       count(*) over(partition by fage) 同龄人个数
  from t_person

ORDER BY子句

使用ORDER BY子句可以对结果集按照指定的排序规则进行排序,并且在一个指定的范围内进行聚合运算。ORDER BY子句的语法为:

ORDER BY 字段名 RANGE|ROWS BETWEEN 边界规则1 AND 边界规则2

RANGE表示按照值的范围进行范围的定义,
ROWS表示按照行的范围进行范围的定义;
边界规则的可取值见下表:
在这里插入图片描述

例子一:查询从第一行到当前行的工资总和
select fname,
	fcity,
	fage,
	fsalary,
	sum(salary) over(order by fsalary rows between unbounded preceding and current row) 到当前工资求和
from t_person

可以简化为:
select fname,
       fcity,
       fage,
       fsalary,
       sum(fsalary) over(order by fsalary) 到当前行工资求和
from t_person

在这里插入图片描述

例子二:把例子程序一的row换成了range,是按照范围进行定位的
select fname,
       fcity,
       fage,
       fsalary,
       sum(fsalary) over(order by fsalary range between unbounded preceding and current row) 到当前行工资求和
  from t_person

在这里插入图片描述
高级开窗函数/ 排名的实现ROW_NUMBER();rank() ,dense_rank()

SELECT FName, FSalary,FAge,
	RANK() OVER(ORDER BY fsalary desc) f_RANK,
	DENSE_RANK() OVER(ORDER BY fsalary desc) f_DENSE_RANK,
	ROW_NUMBER() OVER(ORDER BY fsalary desc) f_ROW_NUMBER
FROM T_Person;

在这里插入图片描述

dence_rank在并列关系是,相关等级不会跳过。rank则跳过
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。

【语法】
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
dense_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
ROW_NUMBER()
【语法】ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 
【功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的) 
row_number() 返回的主要是“行”的信息,并没有排名

SQL开窗函数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100177.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 数据结构PDF下载

    数据结构PDF下载数据结构算法实现及解析C语言[第二版]高一凡pdf文字版http://qunying.jb51.net:81/201303/books/sjjg_sfszjjx_jb51net.rar大话数据结构中文PDF清晰扫描版完整版[36M]http://qunying.jb51.net:81/201209/books/dhsjjg_jb51.rarC#语言描述数据结构pdf版ht…

  • 公网IP和内网IP区别

    公网IP和内网IP区别什么是内网IP:一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IPSharing),使用整个公司或学校的机器都能够访问互联网。而这些企业或学校的机器使用的IP地址就是内网IP,内网IP是在规划IPv4协议时,考虑到IP地址资源可能不足,就专门为内部网设计私有IP地址(或称之为保留地址),一般常用内网IP地址都是这种形式的:10.X.X.X、172.16.X.X-1…

  • php7使用curl扩展「建议收藏」

    php7使用curl扩展「建议收藏」  前言:最近项目中要调用一些接口,看到网上很多都使用curl,但由于刚开始,php很多的语法都不是很熟悉,例如如何调用第三方函数等,为了使用curl_init()等函数,从安装php的扩展curl开始踩了很多坑,对于环境安装真的是比较头疼的事情,往往可能因为一些小问题而不成功,而且按照网上乱七八糟的博客说的做,真的一点用都没有,特此记录一下,希望以后的编程生涯中尽量少犯这种错误。首先给出环境…

    2022年10月21日
  • python的进制转换器,Python进制转换[通俗易懂]

    python的进制转换器,Python进制转换[通俗易懂]进制转换:进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。简单转换理念:把二进制三位一组分开就是八进制,四位一组就是十六进制二进制与十进制:(1)二进制转十进制:“按权展开求和”(1011)2=1×2**3+0x2**2+1x…

  • PAT考试一些注意事项[通俗易懂]

    有除法时,特别处理分母为0的情况 执行后发现卡住了,很有可能是scanf时忘记写&了 if判断语句注意不要把==写成= 程序提交后显示超时,注意检查循环跳出情况,for中的i–是不是写成了i++ 判断素数时,i的取值范围[2,sqrt(a)],其中a是待判断的数 把ID当成int类型时,最后输出记得在前面添加0补齐 当图的节点有>=10000个时,用邻接…

  • JAVA实现对PDF文件加密、解密、暴力激活成功教程密码功能「建议收藏」

    JAVA实现对PDF文件加密、解密、暴力激活成功教程密码功能「建议收藏」pom需要引入的依赖 <!–https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox–> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>3.0.0-RC1</version> .

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号