mysql如何进行累加计算

前言

接了一个需求,产品想分析一下用户增加的曲线。也就是某个时间段的每日总人数列表。好对近期活动进行一个效果的评测。这个统计sql仍是花了我一小段时间的。mysql统计这个仍是须要必定的技巧的。java

需求分析

user_id reg_time
1 2019-09-03
2 2019-09-04
3 2019-09-04
4 2019-09-05
5 2019-09-05
6 2019-09-06

假如上表user_info,咱们很容易根据时间维度统计出每日新增的人数。sql以下:mysql

select reg_time, count(user_id) daily_quantity
  from user_info
group by reg_time

经过上面的sql咱们很容易得出如下列表:sql

reg_time daily_quantity
2019-09-03 1
2019-09-04 2
2019-09-05 2
2019-09-06 1

可是这个并非咱们想要的结果。咱们想要的应该是 上一天的总人数加上今天的净增加数,以此类推。也就是咱们想要:数据库

reg_time daily_quantity
2019-09-03 1
2019-09-04 3
2019-09-05 5
2019-09-06 6

这就有点棘手了,咱们须要进行累加计算。我尝试了自连接,函数等一些操做后仍是没有获得一个正确的结果。这时想到若是是java代码处理这个就再合适不过了,咱们只要声明初始值,而后循环累加就能计算出结果了:函数

public static void main(String[] args) {
        int[] arr = {1, 2, 2, 1};

        int[] ints = dailyQuantityArr(0, arr);


        for (int i : ints) {
            System.out.println("i = " + i);
        }


    }


    public static int[] dailyQuantityArr(int base, int[] dailyIncrQuantity) {


        int[] result = new int[dailyIncrQuantity.length];
        // 累加填充
        for (int i = 0; i < dailyIncrQuantity.length; i++) {
            base += dailyIncrQuantity[i];

            result[i] = base;

        }
        return result;
    }

上面的伪代码就能够计算出结果。固然若是能够的话尽可能在java业务代码进行这种复杂运算。可是产品给出的需求是咱们可以提供一句sql可以直接在可视化数据引擎中得出他要的答案。因而从上面的代码得出灵感。
mysql是否有这种变量呢? 有!固然有。记得很广泛的场景,之前常常有业务须要咱们输出序号,Oracle是自带一个伪列rownum,可是mysql没有。mysql一般经过声明自增变量来生成序号。拿user_info表举例子:学习

select (@i:=@i+1) as rownum, user_id 
   from user_info ,(select @i:=0) as r

Mysql 用户变量

mysql 变量分为 局部变量、用户变量、会话变量、全局变量 。上面的语句咱们使用的是用户变量。用户变量与数据库链接有关,在链接中声明的变量,在存储过程当中建立了用户变量后一直到数据库实例接断开的时候,变量就会消失。在此链接中声明的变量没法在另外一链接中使用。
MySQL中用户变量不用事前申明,使用的时候以@varname的格式进行声明。经过:=或者=进行赋值操做。若是须要对外输出须要用select关键字,并且赋值必须使用:=编码

使用Mysql用户变量进行累加计算

咱们学习了用户变量后就知道如何进行累加计算了,那么user_info表的日累计总人数应该是这样的:spa

select a.reg_time,
             a.daily,
          @i:=@i+a.daily as daily_quantity  
        from (select reg_time ,        
        count(user_id) daily 
        from user  group by  reg_time ) a ,
       (select @i:=0) b

查询的结果以下,符合逻辑须要。code

reg_time daily daily_quantity
2019-09-03 1 1
2019-09-04 2 3
2019-09-05 2 5
2019-09-06 1 6

可是这里有一个小坑,在实际业务中@i初始化的时候有可能不为0,好比咱们统计上面9月4号到9月6号这时候以前的总人数为1 。 这个要特别注意。实际业务开发中若是咱们能在逻辑编码中实现仍是建议在逻辑编码中进行一些复杂的运算。开发

总结

今天咱们经过mysql用户变量解决了一个在sql中累加计算的问题。不知道你有没有其它好的思路呢?欢迎留言讨论。

关注公众号:码农小胖哥 获取更多资讯

相关文章
相关标签/搜索