点击蓝色“程序猿DD”关注我

回复“资源”获取独家整理的学习资料!

作者 | 码农小胖哥

来源 | 公众号「码农小胖哥」

01

前言

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

02

需求分析

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如下:

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

通过上面的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

03

Mysql 用户变量

mysql 变量分为 局部变量、用户变量、会话变量、全局变量 。上面的语句我们使用的是用户变量。用户变量与数据库连接有关,在连接中声明的变量,在存储过程中创建了用户变量后一直到数据库实例接断开的时候,变量就会消失。在此连接中声明的变量无法在另一连接中使用。

MySQL中用户变量不用事前申明,使用的时候以@varname的格式进行声明。通过 := 或者 = 进行赋值操作。如果需要对外输出需要用 select 关键字,而且赋值必须使用 :=  符号。

04

Mysql累加计算

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

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

查询的结果如下,符合逻辑需要。

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 。这个要特别注意。实际业务开发中如果我们能在逻辑编码中实现还是建议在逻辑编码中进行一些复杂的运算。

05

总结

今天我们通过mysql用户变量解决了一个在sql中累加计算的问题。

不知道你有没有其它好的思路呢?欢迎留言讨论

-END-

留言交流不过瘾

关注我,回复“加群”加入各种主题讨论群

朕已阅 

MySQL中只会count(),sum()?累加运算没听过?相关推荐

  1. MYSQL中的SELECT查询时进行运算

    SELECT在mysql中是查询表中的数据的作用,但也可以在查询的时候直接进行运算,然后返回查询后的结果 比如 1 SELECT user,math*(IFNULL(adven,0)) FROM us ...

  2. mysql中只运行一部分数据_MySQL(一)——MySQL基础和部分面试题

    MySQL基础: 数据库的创建与删除 CREATE DATABASE ;//创建数据库 DROP DATABASE ;//删除数据库 数据库表的创建与删除 CREATE TABLE (column_n ...

  3. MySQL中聚合函数count的使用和性能优化

    本文将探讨以下问题 1.count(*) . count(n).count(null)与count(fieldName) 2.distinct 与 count 连用 3.group by (多个字段) ...

  4. MYSQL中只知表名查询属于哪个SCHEMA

    只知道表名XXX查该表属于哪个schema.以及该表有哪些列等信息 SELECT * from information_schema.columns WHERE table_name = 'xxx'; ...

  5. mysql count innodb 不正确_关于mysql中innodb的count优化问题分享

    一般采用二级索引去count: 比如:id 是pk aid是secondary index 采用 复制代码 代码如下: select count(*) from table where id > ...

  6. mysql中整理设置__MySQL整理

    登录 命令:mysql -h [IP 地址/域名] -P [端口] -u [用户名] -p[密码] 端口默认是3306 mysql -hlocalhost -uroot -p 断开 exit; \q; ...

  7. 详细介绍mysql中的运算符

    运算符 1.算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加(+).减(-).乘(*).除(/)和取模(%)运算. 加法与减法运算符 由运算结果可以 ...

  8. MySQL数据库,从入门到精通:第四篇——MySQL中常用的运算符及其用法

    MySQl学习(MySQL数据库,从入门到精通:第四篇--MySQL中常用的运算符及其用法 第四篇_MySQL中常用的运算符及其用法运算符 1. 算术运算符 1.加法与减法运算符 2.乘法与除法运算符 ...

  9. tp操作mysql_tp 在tp中查询mysql中使用MySQL的函数if()等

    在mysql 中:查询数据,通过if()判断可以对不符合要求的数据进行修改.如 select if(pdi,pid,10) as pid ,name from user; 这sql的意思是再查询的时候 ...

最新文章

  1. springboot整合shiro-关于登出时,redis中缓存没有清理干净的问题
  2. 2020-07-02 CVPR2020 VL论文讨论(3) 笔记
  3. mysql5.7和8.0的区别_解答阿迪达斯Adidas ultra boost4.0与正品区别!如何选择?
  4. rbw数字信号处理_数字信号处理与模拟IC设计
  5. Nginx 日志配置实践
  6. 从拉萨骑行到珠峰大本营
  7. windows下配置mysql数据库主从
  8. 【Mysql】之基础sql语句模板
  9. 智慧零售怎么做客流统计和客流分析?|图普客流统计系统
  10. CMD下载速度过慢解决方案
  11. 计算机组装维修设置还原点,怎样恢复出厂设置组装电脑
  12. 让·阿方索·德纳(Jean Alfonso decena)引领对话式人工智能创新并颠覆菲律宾金融科技...
  13. imac下修改本地hosts文件解决react项目中的跨域问题
  14. 推荐(笔记软件、日程安排软件)
  15. Postman----打开postman console控制台,查看接口测试打印log
  16. 75个顶级开源安全应用
  17. [boot启动项目调用接口提示“ ] connect error, url jdbc:h2:mem:44xxx 和 No typehandler found for property xxx
  18. 国开电大大学计算机应用基础 (专科)终结性考试试题以及答案(大作业)所有答案和PPT已经做好,直接填写名字学号即可,详情可以看缩略图。
  19. bin 文件复制十六进制00 到其它地方变为 20
  20. ios文件扩展名_安卓JY Share | 还在为担心文件上传成为 base.apk,这个应用帮你解决...

热门文章

  1. python3 subprocess.Popen 报错 No such file or directory
  2. linux c 获取网络接口信息 ioct l函数 ifreq ifconf 结构体 简介
  3. pyinstaller 安装使用方法
  4. CMD中使用attrib命令设置文件只读、隐藏属性详解
  5. winsock setsockopt 详解
  6. Android Service 全解析
  7. Android中的事件处理机制
  8. Linux 内核中的 Device Mapper 机制
  9. 4图纸 rust_看完这篇,国外的图纸也能看懂
  10. html中投影效果图,利用CSS3(box shadow)制作边框投影