前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小白学习MySQL - 增量统计SQL的需求 - 开窗函数的方案

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

作者头像
bisal
发布2022-06-30 14:48:14
1.2K0
发布2022-06-30 14:48:14
举报
文章被收录于专栏:bisal的个人杂货铺

小白学习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是个统计值,

8bf5676084501f4121ffc33d14373fde.png
8bf5676084501f4121ffc33d14373fde.png

如果直接用开窗函数,

代码语言:javascript
复制
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 total
from tt;

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

49c1cb1d80ad627bf3df10a8b2468512.png
49c1cb1d80ad627bf3df10a8b2468512.png

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

代码语言:javascript
复制
select t.code, t.cdate, t.total, 
sum(t.total) over (partition by t.code order by t.cdate) as g_total
from 
(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 total
from tt) t
where t.r_seq = 1;

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

20222fa9d66c461085223b99e6849976.png
20222fa9d66c461085223b99e6849976.png

根据需求写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 - 闲聊聊

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档