小白学习MySQL - 增量统计SQL的需求 - 开窗函数的方案
Posted bisal(Chen Liu)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白学习MySQL - 增量统计SQL的需求 - 开窗函数的方案相关的知识,希望对你有一定的参考价值。
《小白学习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 total
from 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_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,实现了增量累加,
根据需求写SQL,往往可能有很多种写法,虽然殊途同归,但若考虑性能、简洁、易懂等因素,就会大相径庭。如果各位有更好的解决方案,欢迎私信,借鉴学习。
小白学习MySQL
《小白学习MySQL - varchar类型字段为什么经常定义成255?》
《小白学习MySQL - TIMESTAMP类型字段非空和默认值属性的影响》
《小白学习MySQL - InnoDB支持optimize table?》
《小白学习MySQL - table_open_cache的作用》
《小白学习MySQL - only_full_group_by的校验规则》
《小白学习MySQL - max_allowed_packet》
《小白学习MySQL - mysqldump保证数据一致性的参数差异》
《小白学习MySQL - MySQL会不会受到“高水位”的影响?》
近期更新的文章:
《充电宝的玄机》
近期的热文:
文章分类和索引:
以上是关于小白学习MySQL - 增量统计SQL的需求 - 开窗函数的方案的主要内容,如果未能解决你的问题,请参考以下文章