千家信息网

SQL中的开窗函数详解可代替聚合函数使用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难
千家信息网最后更新 2026年11月02日SQL中的开窗函数详解可代替聚合函数使用

在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难懂,给维护代码的人带来很大的痛苦,然而开窗函数出现了,曙光也来临了。如果要想更具体了解开窗函数,请看书《程序员的SQL金典》,开窗函数在mysql不能使用。

开窗函数与聚合函数一样,都是对行的集合组进行聚合计算。它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用group by语句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。定义看不懂不要紧,会用就行。

举个简单例子 查询每个工资小于5000的员工信息(姓名,城市 年龄 薪水),并且显示小于5000的员工个数,尝试使用下面语句:

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) FROM T_Person WHERE FSALARY<5000

消息 8120,级别 16,状态 1,第 1 行
选择列表中的列 'T_Person.FName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

可以使用子查询实现,语句:

SELECT FName, FCITY, FAGE, FSalary, ( SELECT COUNT(FName) FROM T_Person WHERE FSALARY<5000 ) PersonNum FROM T_Person WHERE FSALARY<5000

结果:

使用开窗函数实现,查询结果一模一样,就不粘贴了:

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) OVER() as PersonNum FROM T_Person WHERE FSALARY<5000

1.开窗函数格式:函数名(列) OVER(选项)

2.聚合开窗函数格式:聚合函数(列) OVER(PARTITION BY 字段)

over关键字把聚合函数当成聚合开窗函数而不是聚合函数,SQL标准允许将所有的聚合函数用做聚合开窗函数。OVER关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围。如果OVER关键字后的括号为空,则开窗函数会对结果集合的所有行进行聚合运算。

PARTITION BY来定义行的分区来进行聚合运算,与group by 不同,partition by 字句创建的分区是独立于结果集的,创建的分区只是用于进行聚合运算,而且不同的开窗函数所创建的分区不互相影响,例如:查询所有人员的信息,并查询所属城市的人员数以及同年龄的人员数:

SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY) CityNum, COUNT(FName) OVER(PARTITION BY FAGE) AgeNum FROM T_Person ORDER by FCITY

查询所有人员的信息,并查询所属城市的人员数,每个城市的人按照年龄排序语句:

SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY ORDER BY FAGE) CityNum FROM T_Person 

3.排序开窗函数格式:排序函数() OVER(ORDER BY 字段)

(1)主要函数有ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE()

ROW_NUMBER() 加行号,一般可以用于分页查询(现在被offset fetch取代 ),对于没有主键列的表加行号作用很明显,删除重复数据等。

按照薪水高低给所有人员排序,同样薪水的排名不一样,可以用row_number(),

with a as (SELECT FName, FSalary, FCity, FAge, ROW_NUMBER() over(ORDER BY FSalary) as RowNum FROM T_Person )SELECT * FROM a 

使用rank()将每个城市的薪水排行,值一样的同一个排名,出现两个第一名的时候,排在两个第一名后的排名将是第三名

SELECT FName, FSalary, FCity, FAge, RANK() over(PARTITION BY FCITY ORDER BY FSalary) as RankNum FROM T_Person 

使用dense_rank()将每个城市的薪水排行,值一样的同一个排名,出现两个第一名的时候,排在两个第一名后的排名将是第三名

ntile(数字) over(order by 字段):数字表示一组多少个数,并根据数量得出分组的数量

SELECT *,NTILE(5) OVER(ORDER BY FSalary) AS NileNum FROM T_Person

总结

到此这篇关于SQL中的开窗函数详解可代替聚合函数使用的文章就介绍到这了,更多相关SQL 开窗函数内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

函数 查询 字段 人员 城市 分组 薪水 语句 运算 两个 结果 一名 排序 信息 关键 关键字 年龄 文章 格式 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 重生之互联网科技帝国 互联网和科技技术 互联网科技开发公司 互联网金融与金融科技 迪茉互联网科技 人人互联网科技是培训 新华互联网科技校企合作 太原新华互联网科技学校怎么样 受益于互联网科技的高速发展 链环科技传统企业怎么转型互联网 华夏恒生互联网科技013171 众安科技工业互联网合作 智帮互联网科技公司最近动向 江苏苏星互联网科技有限公司 互联网相关科技技术 广州燕处互联网科技有限公司 九思连强互联网电子科技有限公司 普陀区互联网教育科技管理办法 兰石爱特工业互联网科技分公司 美国五大互联网科技公司市值多少 互联网医疗科技 万达互联网科技 伴你行互联网科技有限公司 深圳卡尔迅互联网科技有限公司怎么样 欧洲十大科技互联网公司 彤创互联网科技有限公司 互联网金融科技公司的优势 互联网企业科技类企业如何做账 科技互联网经济论坛 马化腾互联网科技教学
0