MySQL窗口函数 over(partition by)的用法

 更新时间:2024年02月23日 15:25:50   作者:xia_codings  
本文主要介绍了MySQL窗口函数 over(partition by)的用法, partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序,下面就来介绍一下具体用法,感兴趣的可以了解一下

概念

开窗函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化

语法

row_number() over(partition by 分组列 order by 排序列 desc) as rowno

rank() over(partition by 分组列 order by 排序列 desc) as rowno

dense_rank() over(partition by 分组列 order by 排序列 desc) as rowno

row_number()是对行的排序编号:不重复:1,2,3,4,5,6
rank()是对行的排序编号:会重复,总数不变:1,1,3,3,5,6
dense_rank()是对行的排序编号:会重复,总数减少:1,1,2,2,3,4

row number() + over()中添加partition by 则表示按照对象分组后排序编号

在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by,但不晚于 order by 的执行。

需求案例:按 orderId 然后从每组取出 lastUpdateTime 最大的一条纪录

SELECT  *  FROM
 ( SELECT *, ROW_NUMBER () OVER (PARTITION BY orderId  ORDER BY lastUpdateTime DESC) rn 
		FROM tableName	) t        
WHERE t.rn <= 1

另一种实现 利用substring_index 取某个字段

这里实现是通过对相应字段分组,然后通过group_concat函数将 orderId 字段按照更新时间lastUpdateTime 字段排序并连接成一个字符串,group函数默认的缺省值是按照逗号分割,最后通过subString_index函数分割逗号并调用第一个

SELECT orderId,
SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY lastUpdateTime DESC ),',',1) status
FROM tableName	
GROUP BY orderId

PARTITION BY与GROUP BY区别

group by是分组函数,partition by是分析函数

在执行顺序上:from > where > group by > having > order by,而partition
by应用在以上关键字之后,可以简单理解为就是在执行完select之后,在所得结果集之上进行partition by分组

partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序,而group
by则只保留参与分组的字段和聚合函数的结果

官方文档:https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

优质解析:

https://blog.csdn.net/weixin_51146329/article/details/127856341

https://blog.csdn.net/ZYC88888/article/details/129676229

到此这篇关于MySQL窗口函数 over(partition by)的用法的文章就介绍到这了,更多相关MySQL over(partition by)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL COALESCE 函数使用示例详解

    MySQL COALESCE 函数使用示例详解

    COALESCE是一种SQL函数,用于返回参数列表中第一个非NULL的值,它常用于处理可能存在NULL值的场景,并提供默认值或备用值,这篇文章给大家介绍MySQL COALESCE 函数使用,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • MySQL数据库存储的路径反斜杠"\"消失了的问题解决

    MySQL数据库存储的路径反斜杠"\"消失了的问题解决

    文章主要讨论了在将包含反斜杠路径存入数据库时遇到的问题的解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2026-05-05
  • MySQL查询时指定使用索引的实现

    MySQL查询时指定使用索引的实现

    在MySQL中,可以通过指定查询使用的索引来提高查询性能和优化查询执行计划,本文就来介绍一下MySQL查询时指定使用索引的实现,感兴趣的可以了解一下
    2023-11-11
  • 优化MySQL的慢查询过程

    优化MySQL的慢查询过程

    这篇文章主要介绍了优化MySQL的慢查询过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • MySQL数据库所在服务器磁盘满了的故障分析和解决方法

    MySQL数据库所在服务器磁盘满了的故障分析和解决方法

    这篇文章主要给大家介绍了MySQL数据库所在服务器磁盘满了的故障分析和解决方法,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • mysql8.0.21安装教程图文详解

    mysql8.0.21安装教程图文详解

    这篇文章主要介绍了mysql8.0.21安装教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • MySQL唯一索引与逻辑删除冲突的解决方案汇总

    MySQL唯一索引与逻辑删除冲突的解决方案汇总

    这篇文章主要介绍了在业务系统中使用逻辑删除时,如何处理唯一索引与逻辑删除冲突的问题,文章介绍了多种解决方案,包括将删除标识设置为NULL、使用时间戳、新增删除唯一标识字段、虚拟生成列、物理删除加历史表以及引入外部缓存,需要的朋友可以参考下
    2025-11-11
  • 在 MySQL 中快速的复制一张表包括表结构和数据

    在 MySQL 中快速的复制一张表包括表结构和数据

    文章介绍了四种复制MySQL表的方法,包括CREATE TABLE...SELECT、CREATE TABLE...LIKE...INSERT、mysqldump工具和物理文件复制,每种方法都有其适用场景和优缺点,面试时,应根据表的大小、结构完整性、效率和适用场景选择合适的方法,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 利用mycat实现mysql数据库读写分离的示例

    利用mycat实现mysql数据库读写分离的示例

    本篇文章主要介绍了利用mycat实现mysql数据库读写分离的示例,mycat是最近很火的一款国人发明的分布式数据库中间件,它是基于阿里的cobar的基础上进行开发的,有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 查询MySQL用户两种的最常用方法总结

    查询MySQL用户两种的最常用方法总结

    在MySQL数据库管理中,查看用户信息是权限控制和安全审计的基础操作,这篇文章主要介绍了查询MySQL用户两种的最常用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-12-12

最新评论