首页 > 数据库 >mysql窗口函数

mysql窗口函数

时间:2024-10-21 10:59:18浏览次数:8  
标签:窗口 函数 OVER PARTITION user mysql duration ORDER name

窗口函数

SUM() 统计

SELECT 
	*, 
	SUM(duration) OVER() AS exp1, 
	## 统计全部数据合计值
	SUM(duration) OVER(PARTITION BY user_name) AS exp2, 
	## 分组求和,不同数据相同分组会展示相同的累积值
	SUM(duration) OVER(ORDER BY `date` ASC) AS exp3, 
	## 全部数据累积和,根据排序统计当前的数据+前面的数据和
	SUM(duration) OVER(PARTITION BY user_name ORDER BY `date` ASC) AS exp4
	## 分组数据累积和,相同分组排序不同数据会统计当前数据+前面数据和
FROM 
	video_play;

count() 计数

SELECT 
	*, 
	COUNT(duration) OVER() AS exp1,
	## 总数
	COUNT(duration) OVER(PARTITION BY video_type) AS exp2,
	## 分组计数,不同组数量
	COUNT(duration) OVER(ORDER BY duration) AS exp3, 
	## 全部数据累积数量
	COUNT(duration) OVER(PARTITION BY video_type ORDER BY duration ASC) AS exp4
    ## 排序后分组累积数量
FROM 
	video_play;

AVG() 平均数

SELECT 
	*, 
	AVG(duration) OVER() AS exp1, 
	AVG(duration) OVER(PARTITION BY user_name) AS exp2, 
	AVG(duration) OVER(ORDER BY `date` ASC) AS exp3, 
	AVG(duration) OVER(PARTITION BY user_name ORDER BY `date` ASC) AS exp4 
FROM 
	video_play;

ROW_NUMBER() 行号,唯一值

SELECT 
	*, 
	ROW_NUMBER() OVER() AS exp1, 
	## id号
	ROW_NUMBER() OVER(PARTITION BY user_name) AS exp2,
	ROW_NUMBER() OVER(ORDER BY `date` ASC) AS exp3, 
	ROW_NUMBER() OVER(PARTITION BY user_name ORDER BY `date` ASC) AS exp4 
	## 分组后排序展示行号,不存在相同的行号
FROM 
	video_play;
	
## 举例 每个用户根据duration升序,相同的根据date倒叙,找到前两名
WITH user_video_play_index AS (
	SELECT
		user_name,
		video_type,
		duration,
		ROW_NUMBER() OVER(PARTITION BY user_name ORDER BY duration DESC, date ASC) AS row_num
	FROM 
		video_play
)

SELECT 
	user_name,
	video_type,
	duration,
	row_num
FROM
	user_video_play_index
WHERE
	row_num <= 2

RANK() 和DENSE_RANK()存在并列排名

SELECT 
	*, 
	RANK() OVER() AS exp1, 
	RANK() OVER(PARTITION BY user_name) AS exp2, 
	RANK() OVER(ORDER BY duration ASC) AS exp3, 
	RANK() OVER(PARTITION BY user_name ORDER BY duration ASC) AS exp4,
	## RANK()格式为1224,会跳过排名
	DENSE_RANK() OVER() AS exp5, 
	DENSE_RANK() OVER(PARTITION BY user_name) AS exp6, 
	DENSE_RANK() OVER(ORDER BY duration ASC) AS exp7, 
	DENSE_RANK() OVER(PARTITION BY user_name ORDER BY duration ASC) AS exp8
	## DENSE_RANK格式为1223
FROM 
	video_play

FIRST_VALUE()和LAST_VALUE() 排序后的第一位和最后一位

SELECT 
	*, 
	FIRST_VALUE(duration) OVER() AS exp1, 
	FIRST_VALUE(duration) OVER(PARTITION BY user_name) AS exp2, 
	FIRST_VALUE(duration) OVER(ORDER BY duration ASC) AS exp3, 
	FIRST_VALUE(duration) OVER(PARTITION BY user_name ORDER BY duration ASC) AS exp4,
	## first_value取得始终都是首位值
	LAST_VALUE(duration) OVER() AS exp5,
	LAST_VALUE(duration) OVER(PARTITION BY user_name) AS exp6, 
	LAST_VALUE(duration) OVER(ORDER BY duration ASC) AS exp7, 
	LAST_VALUE(duration) OVER(PARTITION BY user_name ORDER BY duration ASC) AS exp8 
	## LAST_VALUE会随着窗口大小的增加变化,基本上是当前行的值
FROM 
	video_play

LAG()和LEAD() 前后推行取值

SELECT 
	*, 
	LAG(duration, 2, 0) OVER() AS exp1, 
	LAG(duration, 2, 0) OVER(PARTITION BY user_name) AS exp2, 
	LAG(duration, 2, 0) OVER(ORDER BY duration ASC) AS exp3, 
	LAG(duration, 2, 0) OVER(PARTITION BY user_name ORDER BY duration ASC) AS exp4,
	## 取前两行数据,前两行不存在值取默认值0,可以用于获取昨日数据
	LEAD(duration, 2, 0) OVER() AS exp5,
	LEAD(duration, 2, 0) OVER(PARTITION BY user_name) AS exp6, 
	LEAD(duration, 2, 0) OVER(ORDER BY duration ASC) AS exp7, 
	LEAD(duration, 2, 0) OVER(PARTITION BY user_name ORDER BY duration ASC) AS exp8 
FROM 
	video_play

NTILE() 数据均分

SELECT 
	*, 
	NTILE(2) OVER() AS exp1, 
	NTILE(2) OVER(PARTITION BY user_name) AS exp2, 
	NTILE(2) OVER(ORDER BY duration ASC) AS exp3, 
	NTILE(2) OVER(PARTITION BY user_name ORDER BY duration ASC) AS exp4
	## 将分组排序后的数据进行均分,两个为一组,112233排
FROM 
	video_play

others 定义窗口框架

ROWS 指定窗口函数范围

SELECT
    id,
    value,
    SUM(value) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_values
    ## 计算范围控制在当前行的前1后1,排序后的行数
FROM
    your_table;

RANGE 按照日期指定范围(最常使用)

SELECT
    date_column,
    value,
    SUM(value) OVER (ORDER BY date_column RANGE BETWEEN INTERVAL 7 DAY PRECEDING AND INTERVAL 3 DAY FOLLOWING) AS sum_values
    ## 根据date_column的前七后三天范围聚合
    ## DAY修改为method以月维度取范围
FROM
    your_table;

GROUPS

SELECT
    id,
    value,
    SUM(value) OVER (PARTITION BY category ORDER BY id GROUPS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS sum_values
    ## 分组后的前1后1行  mysql中无
FROM
    your_table;

标签:窗口,函数,OVER,PARTITION,user,mysql,duration,ORDER,name
From: https://www.cnblogs.com/leaveName/p/18488978

相关文章

  • 动态中的守候:滑动窗口与距离的诗篇
    公主请阅1.长度最小的子数组1.1题目说明示例1示例1示例2示例31.2题目分析1.3代码部分1.4代码分析2.无重复字符的最长子串2.1题目说明示例1示例1示例2示例32.2题目分析2.3代码部分2.4代码分析2.5代码深度分析1.长度最小的子数组题目传......
  • 云函数+对象存储全包!MemFire Cloud让开发如此轻松
    在开发世界里,想要快速交付一个产品,后端服务、数据存储和API接口等往往是让开发者最头疼的环节。尤其是对于个人开发者或者小型团队而言,想要自己搭建完整的后端架构,无疑是一项费时费力的工作。现在有了MemFireCloud,这一切都变得简单了。MemFireCloud是一款为“懒人”开发者......
  • MySQL 中 DATETIME 和 TIMESTAMP 时间类型详解
    MySQL的日期类型简介在MySQL中有两种存储时间的数据类型 DATETIME 和 TIMESTAMP,它们在数据库实际应用中,各有各的优势和劣势。一.DATETIME和TIMESTAMP的相同点两个数据类型存储时间的格式一致。均为YYYY-MM-DDHH:MM:SS两个数据类型都包含「日期」和「时间」部分。......
  • C10-08-宽字节注入-mysql注入之getshell-sqlmap
    一宽字节注入利用宽字节注入实现“库名-表名”的注入过程。靶场环境:容器镜像:area39/pikachu宽字节概念1、如果一个字符的大小是一个字节的,称为窄字节;2、如果一个字符的大小是两个及以上字节的,称为宽字节;像GB2312、GBK、GB18030、BIG5、Shift_JIS等编码都是常见的宽字节......
  • [oeasy]python037_ print函数参数_sep分隔符_separator
    print函数参数_sep分隔符_separator回忆上次内容上次了解了类型type本意来自于印记   添加图片注释,不超过140字(可选) 要特别注意type类型   添加图片注释,不超过140字(可选) 给函数传递参......
  • [数据库][mysql]MySQL基础
    1,数据库相关概念以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。假设在文件中存储以下的数据:姓名 年龄 性别 住址张三 23 男 北京西三旗李四 24 女 北京西二旗王五 25 男 西安软件新城现......
  • [数据库][mysql]mysql高级
    1,约束上面表中可以看到表中数据存在一些问题:id列一般是用标示数据的唯一性的,而上述表中的id为1的有三条数据,并且 马花疼 没有id进行标示柳白 这条数据的age列的数据是3000,而人也不可能活到3000岁马运 这条数据的math数学成绩是-5,而数学学得再不好也不可能出现负分......
  • 【重学 MySQL】七十三、灵活操控视图数据,轻松掌握视图删除技巧
    【重学MySQL】七十三、灵活操控视图数据,轻松掌握视图删除技巧更新视图数据:灵活操控,即时反映删除视图:优雅清理,保持数据库整洁深度解析:为何更新和删除视图如此重要?结语在MySQL的数据管理中,视图(View)作为一种虚拟表,为我们提供了极大的便利,它不仅能够简化复......
  • MySQL5.7 InnoDB在线DDL操作
    MYSQL官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html目录在线DDL原理在线DDL支持情况IndexOperations(索引操作)PrimaryKeyOperations(主键操作)ColumnOperations(列操作)TableOperations(表操作)pt-osc方式在线DDL和pt-osc对比参考在线DDL原理MySQL5.6......
  • 10.19 窗口1.0(之后会完善代码,学到哪完善到哪)
    JFrame类的实例是一个底层容器(窗口)其他组件必须被添加到底层容器中,以便借助这个容器和操作系统进行信息交互。Jframe类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创建一个对象。窗口不能添加到另一个容器中JFrame()创建一个无标题窗口JFrame(Strings)创......