首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

MySQL三种开窗函数详细用法,图文详解

  • 25-03-07 23:41
  • 3724
  • 12132
blog.csdn.net

开窗函数的详细用法

  • 第一章、开窗函数的语法
    • 1.1)从聚合开窗函数讲起
    • 1.2)开窗函数之取值
    • 1.3)排名开窗函数

第一章、开窗函数的语法

开窗函数的语法为:over(partition by 列名1 order by 列名2 ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数。

1.1)从聚合开窗函数讲起

sum()是聚合函数,当 sum()函数 后面跟上 over()以后,由sum聚合函数就成为了开窗函数。

over() 括号里面就是定义窗口的内容了,partition 是分区,分组的意思。partition by 就是根据某个字段分组。

sum(score)  over(partition by name )
  • 1

先根据 name 分组(如图),当前面加了sum(score)后就把根据name分组后的,每个(组)窗口里面的字段 score进行求和操作。

select *,sum(score)  over(partition by name) sum窗口函数举例
from kchs
-- 为了简单就只有两个字段,name和score
  • 1
  • 2
  • 3

在这里插入图片描述
聚合函数同样需要对数据进行排序,但不会显示排名结果。会将当前名次的数据 与 排在这之前的所有数据 依次做相应的计算。

执行语句:

select *,
sum(score) over (order by id) as 累加求和
from kchs
  • 1
  • 2
  • 3

在这里插入图片描述

拓展一下:
一,很多聚合函数都可以用作窗口函数的运算,如SUM、AVG、MAX、MIN、COUNT。
二,和gropu by 不同的是窗口函数会生成多行,而不是想group by 一样只有一行

1.2)开窗函数之取值

first_value

first_value

lead

lag
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

first_value:是在窗口里面取到第一个值

first_value(score) over( partition by name)as first_score ,
根据name分区(组),取score列的第一个值
  • 1
  • 2

last_value:是在窗口里面取到最后一个值

last_value(score) over(partition by name) as last_score
--根据name分区(组),取score列的最后一个值
  • 1
  • 2

lead 是取当前行的后 N 条数据,并且可以设置默认值

lead(score,1,0) over(partition by name ) as lead_score
--根据name分区(组),score列当前行的后面N行,,如果没有就为默认值0
  • 1
  • 2

lag 是取当前行的上 N 条数据,并且可以设置默认值

lag(score,1,0) over(partition by name ) as lag_score 
--根据name分区(组),score列当前行的上面N行,如果没有就为默认值0
  • 1
  • 2

在这里插入图片描述

1.3)排名开窗函数

ROW_NUMBER

DENSE_RANK

RANK
  • 1
  • 2
  • 3
  • 4
  • 5

row_number ()是为每组的行设置一个连续的递增的数字(123456)

ROW_NUMBER() over( partition by name order by score asc)as ROW_NUMBER_score 
  • 1

rank()是排名,也为每一组的行生成一个序号,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如:有三个人并列第一名,第四名序号为四(111456)

rank() over(partition by name order by score asc) as RANK_score
  • 1

DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。例如:有三个人并列第一,第四名序号为2(111234)

DENSE_RANK() over(partition by name order by score asc) as DENSE_RANK_score
  • 1

在这里插入图片描述

注意:
一,排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。
二,ORDER BY 指定排名开窗函数的顺序,在排名开窗函数中必须使用ORDER BY语句。
三,PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树SQL高级技巧CTE和递归查询93243 人正在系统学习中
注:本文转载自blog.csdn.net的Holy_Java的文章"https://blog.csdn.net/baomingshu/article/details/137017141"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

112
数据库
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top