MySQL 对移动范围内的值进行聚集

备注:测试数据库版本为MySQL 8.0

如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本

一.需求

要计算移动聚集。

例如,求表EMP中工资的移动和,要从第一个员工的hiredate开始,计算任何90天内的总和,以观察从雇佣第一个员工至雇佣最后一个员工期间90天开销的波动情况。

应返回以下结果集:

二.解决方案

窗口函数的子句中指定可移动窗口,这个问题就很容易解决。

关键是需要在窗口函数中按hiredate排序,然后指定一个从雇佣第一个员工开始的90天窗口。

如果无法使用这样的窗口函数,则可以使用标量子查询,使起解决方案可能更复杂。

-- 标量子查询写法
select  e.hiredate,
        e.sal,
        (select sum(sal) from emp d
          where d.hiredate between e.hiredate - 90 and e.hiredate) as spending_pattern
  from  emp e
 order  by 1;

测试记录:

mysql> select  e.hiredate,
    ->         e.sal,
    ->         (select sum(sal) from emp d
    ->           where d.hiredate between e.hiredate - 90 and e.hiredate) as spending_pattern
    ->   from  emp e
    ->  order  by 1;
+------------+---------+------------------+
| hiredate   | sal     | spending_pattern |
+------------+---------+------------------+
| 1980-12-17 |  800.00 |           800.00 |
| 1981-02-20 | 1600.00 |          1600.00 |
| 1981-02-22 | 1250.00 |          2850.00 |
| 1981-04-02 | 2975.00 |          2975.00 |
| 1981-05-01 | 2850.00 |          2850.00 |
| 1981-06-09 | 2450.00 |          2450.00 |
| 1981-09-08 | 1500.00 |          1500.00 |
| 1981-09-28 | 1250.00 |          2750.00 |
| 1981-11-17 | 5000.00 |          5000.00 |
| 1981-12-03 |  950.00 |          8950.00 |
| 1981-12-03 | 3000.00 |          8950.00 |
| 1982-01-23 | 1300.00 |          1300.00 |
| 1987-06-13 | 3000.00 |          4100.00 |
| 1987-06-13 | 1100.00 |          4100.00 |
+------------+---------+------------------+
14 rows in set (0.00 sec)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值