mysql滑动聚合/年初至今聚合原理与用法实例分析

 更新时间:2019年12月27日 11:25:18   作者:雪山飞猪  
这篇文章主要介绍了mysql滑动聚合原理与用法,结合实例形式分析了mysql滑动聚合的相关功能、原理、使用方法及操作注意事项,需要的朋友可以参考下

本文实例讲述了mysql滑动聚合/年初至今聚合原理与用法。分享给大家供大家参考,具体如下:

滑动聚合是按顺序对滑动窗口范围内的数据进行聚合的操作。下累积聚合不同,滑动聚合并不是统计开始计算的位置到当前位置的数据。

这里以统计最近三个月中员工第月订单情况为例来介绍滑动聚合。

滑动聚合和累积聚合解决方案的主要区别在于连接的条件不同。滑动聚合条件不再是b.ordermonth <= a.ordermonth,而应该是b.ordermonth大于前三个月的月份,并且小于当前月份。因此滑动聚合的解决方案的SQL语句如下

SELECT
 a.empid,
 DATE_FORMAT(a.ordermonth, '%Y-%m') AS ordermonth,
 a.qty AS thismonth,
 SUM(b.qty) AS total,
 CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg
FROM emporders a
INNER JOIN emporders b
 ON a.empid=b.empid
 AND b.ordermonth > DATE_ADD(a.ordermonth, INTERVAL -3 MONTH)
 AND b.ordermonth <= a.ordermonth
WHERE DATE_FORMAT(a.ordermonth,'%Y')='2015' AND DATE_FORMAT(b.ordermonth,'%Y')='2015'
GROUP BY a.empid,DATE_FORMAT(a.ordermonth, '%Y-%m'),a.qty
ORDER BY a.empid,a.ordermonth

运行结果如下

该解决方案返回的是三个月为一个周期的滑动聚合,但是每个用户包含前两个月并且未满3个月的聚合。如果只希望返回满3个月的聚合,不返回未满3个月的聚合,可以使用HAVING过滤器进行过滤,过滤的条件为MIN(b.ordermonth)=DATE_ADD(a.ordermonth, INTERVAL -2 MONTH),例如

SELECT
 a.empid,
 a.ordermonth AS ordermonth,
 a.qty AS thismonth,
 SUM(b.qty) AS total,
 CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg
FROM emporders a
INNER JOIN emporders b
 ON a.empid=b.empid
 AND b.ordermonth > DATE_ADD(a.ordermonth, INTERVAL -3 MONTH)
 AND b.ordermonth <= a.ordermonth
WHERE DATE_FORMAT(a.ordermonth,'%Y')='2015' AND DATE_FORMAT(b.ordermonth,'%Y')='2015' AND a.empid=1
GROUP BY a.empid,DATE_FORMAT(a.ordermonth, '%Y-%m'),a.qty
HAVING MIN(b.ordermonth)=DATE_ADD(a.ordermonth, INTERVAL-2 MONTH)
ORDER BY a.empid,a.ordermonth

运行结果如下

年初至今聚合和滑动聚合类似,不同的地方仅在于统计的仅为当前一年的聚合。唯一的区别体现在下限的开始位置上。在年初至今的问题中,下限为该年的第一天,而滑动聚合的下限为N个月的第一天。因此,年初至今的问题的解决方案如下图所示,得到的结果

SELECT
 a.empid,
 DATE_FORMAT(a.ordermonth, '%Y-%m') AS ordermonth,
 a.qty AS thismonth,
 SUM(b.qty) AS total,
 CAST(AVG(b.qty) AS DECIMAL(5,2)) AS avg
FROM emporders a
INNER JOIN emporders b
  ON a.empid=b.empid
  AND b.ordermonth >= DATE_FORMAT(a.ordermonth, '%Y-01-01')
  AND b.ordermonth <= a.ordermonth
  AND DATE_FORMAT(b.ordermonth,'%Y')='2015'
GROUP BY a.empid,a.ordermonth,a.qty
ORDER BY a.empid,a.ordermonth

运行结果如下

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总

希望本文所述对大家MySQL数据库计有所帮助。

相关文章

  • MySQL 空间碎片的查看与回收

    MySQL 空间碎片的查看与回收

    ySQL数据库在运行过程中可能会出现空间碎片的问题,本文就来介绍一下MySQL 空间碎片的查看与回收 ,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • mysql8.0 my.ini 如何永久修改时区

    mysql8.0 my.ini 如何永久修改时区

    这篇文章主要介绍了mysql8.0 my.ini 如何永久修改时区,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • MySQL解决Navicat设置默认字符串时的报错问题

    MySQL解决Navicat设置默认字符串时的报错问题

    本文主要介绍了MySQL解决Navicat设置默认字符串时的报错,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 浅谈MySQL之select优化方案

    浅谈MySQL之select优化方案

    我们是否看到过在公司中许多查询语句都是select * xxxx,本文就主要介绍了MySQL之select优化方案,具有一定的参考价值,感兴趣的可以了解一下
    2021-08-08
  • Mysql数据库 ALTER 操作详解

    Mysql数据库 ALTER 操作详解

    这篇文章主要介绍了Mysql数据库 ALTER 操作详解的相关资料,需要的朋友可以参考下
    2022-09-09
  • MySQL使用innobackupex备份连接服务器失败的解决方法

    MySQL使用innobackupex备份连接服务器失败的解决方法

    这篇文章主要为大家详细介绍了MySQL使用innobackupex备份连接服务器失败的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Mysql中xtrabackup备份的实现

    Mysql中xtrabackup备份的实现

    Xtrabackup是Percona团队开发的用于MySQL数据库物理热备份的开源备份工具,本文就来介绍一下Mysql中xtrabackup备份的实现,就有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 详解MySQL InnoDB的索引扩展

    详解MySQL InnoDB的索引扩展

    这篇文章主要介绍了MySQL InnoDB的索引扩展的相关资料,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL 事务autocommit自动提交操作

    MySQL 事务autocommit自动提交操作

    这篇文章主要介绍了MySQL 事务autocommit自动提交操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Navicat自动备份MySQL数据的流程步骤

    Navicat自动备份MySQL数据的流程步骤

    对于从事IT开发的工程师,数据备份我想大家并不陌生,这件工程太重要了!对于比较重要的数据,我们希望能定期备份,每天备份1次或多次,或者是每周备份1次或多次,所以本文给大家介绍了Navicat自动备份MySQL数据的流程步骤,需要的朋友可以参考下
    2024-12-12

最新评论