ITPub博客

首页 > 数据库 > 数据库开发技术 > 小白学习MySQL - 增量统计SQL的需求 - 开窗函数的方案

小白学习MySQL - 增量统计SQL的需求 - 开窗函数的方案

原创 数据库开发技术 作者:bisal 时间:2022-06-28 07:50:00 0 删除 编辑

《小白学习MySQL - 增量统计SQL的需求》中,我们提到了一个MySQL增量统计需求的SQL,其实不止文中用的方案,还会有其他的,很多朋友都提到可以使用MySQL 8.0支持的开窗函数来解决。


Oracle中支持开窗函数,MySQL是从8.0开始支持的,官方文档,

https://dev.mysql.com/doc/refman/8.0/en/window-functions.html


开窗函数的作用,既可显示聚合前的数据,又可显示聚合后的数据。


回顾一下原始的测试数据,测试表tt有三个字段,code是标识名称,cdate是对应的日期,ctotal是个统计值,


如果直接用开窗函数,

select code, date_format(cdate, '%Y-%m'), ctotal,sum(ctotal) over (partition by code, date_format(cdate, '%Y-%m')order by date_format(cdate, '%Y-%m')) as totalfrom tt;


虽然按照cdate做的partition by,但是由于cdate存储的不仅是到"月",没进行聚类,所以即使按照"%Y-%m",展示的是多条,


可以通过去重,达到我们的需求,

select t.code, t.cdate, t.total, sum(t.total) over (partition by t.code order by t.cdate) as g_totalfrom (select code, date_format(cdate, '%Y-%m') as cdate, ctotal,row_number() over (partition by code, date_format(cdate, '%Y-%m') order by code, date_format(cdate, '%Y-%m')) as r_seq,sum(ctotal) over (partition by code, date_format(cdate, '%Y-%m') order by code, date_format(cdate, '%Y-%m')) as totalfrom tt) twhere t.r_seq = 1;


借助了row_number()函数,取出每个月的唯一一条记录,再通过执行partition by,实现了增量累加,


根据需求写SQL,往往可能有很多种写法,虽然殊途同归,但若考虑性能、简洁、易懂等因素,就会大相径庭。如果各位有更好的解决方案,欢迎私信,借鉴学习。



小白学习MySQL

《小白学习MySQL - 统计的"投机取巧"》

《小白学习MySQL - 增量统计SQL的需求》

《小白学习MySQL - 你碰到过这种无法登陆的场景?》

《小白学习MySQL - 不同版本创建用户的些许区别》

《小白学习MySQL - 随机插入测试数据的工具》

《小白学习MySQL - varchar类型字段为什么经常定义成255?》

《小白学习MySQL - 变通创建索引的案例一则》

《小白学习MySQL - “投机取巧”统计表的记录数》

《小白学习MySQL - 一次慢SQL的定位》

《小白学习MySQL - TIMESTAMP类型字段非空和默认值属性的影响》

《小白学习MySQL - 聊聊数据备份的重要性》

《小白学习MySQL - InnoDB支持optimize table?》

《小白学习MySQL - table_open_cache的作用》

《小白学习MySQL - 表空间碎片整理方法》

《小白学习MySQL - 大小写敏感问题解惑》

《小白学习MySQL - only_full_group_by的校验规则》

《小白学习MySQL - max_allowed_packet》

《小白学习MySQL - mysqldump保证数据一致性的参数差异》

《小白学习MySQL - 查询会锁表?》

《小白学习MySQL - 索引键长度限制的问题》

《小白学习MySQL - MySQL会不会受到“高水位”的影响?》

《小白学习MySQL - 数据库软件和初始化安装》

《小白学习MySQL - 闲聊聊》


近期更新的文章:

《国产数据库名录一览》

《小白学习MySQL - 统计的"投机取巧"》

《小白学习MySQL - 增量统计SQL的需求》

《腾讯会议号设计的几种猜测》

《充电宝的玄机》


近期的热文:

《"红警"游戏开源代码带给我们的震撼》


文章分类和索引:

《公众号1000篇文章分类和索引》

原文作者:bisal的个人杂货铺;如有侵权,请联系管理员删除。

上一篇: Oracle和JSON的结合
请登录后发表评论 登录
全部评论
Oracle ACE,10g/11g OCP,11g OCM,国内首批Oracle YEP成员(Oracle Young Expert Program,Oracle用户组年轻专家项目),EXIN DevOps Master,Oracle爱好者,微信公众号:bisal的个人杂货铺

注册时间:2022-06-21

  • 博文量
    539
  • 访问量
    2801339