13号的草稿 12号的明天补充更新,最近太忙了。

  客户留存率是衡量客户价值经常用的指标,可以反映客户的活跃程度,在互联网企业,尤其是现在手机端流量已经超过PC端流量,在安卓和IOS设备上在线时长的数据,电商APP产品的下单频次都可以反映客户的活跃情况。

  近期公司销售人员也需要一些数据,考察销售人员在当月的新开发客户和重新激活客户。

  这里我们定义规则是当月下单过的客户为活跃客户,激活客户为在本月下单,上次下单距离本月下单时间超过30天(今天改了2次代码和客户运营同事沟通知道他们以这个间隔来进行定义客户新增激活留存属性,之前为了配合月报都是以整月为单位,因此出数据之前沟通是很有必要的,统计口径不一样,得到的结果就是互相桑害(⊙o⊙))

  我是这么考虑的。

  考虑到数据库数据更新截止到昨天为止,月初每个月1号时候数据实际是上个月的完整数据,新的一月实际是没数据的,因此1号出数据依然是计算上个月的,2号就是计算新的一月的,因此当月指的是除了每月1号是指上月,其他都是当前月 

  #DATE_FORMAT(DATE_ADD(CURRENT_DATE,INTERVAL -1 DAY) 就是解决每个月1号出现1月所在月数据为空的问题

  1、如果要在表中生成一个留存属性的字段需要判断客户在当月是新增客户,还是留存客户还是重激活客户,需要先把当月客户每天的明细先调出来,找到用户在当月下单的第一天的日期,以这个日期往前推30天判断)下面是代码

SELECT a2.用户ID,a2.订单日期 AS 当月首单日,a2.销售员,a2.订单额 AS 当月首单额#取当月首单日,当月首单销售员,当月首单额
FROM (
SELECT a1.username AS 用户ID,a1.order_date AS 订单日期,a1.salesperson AS 销售员,SUM(a1.pay_money) AS 订单额#当月每一天明细
FROM test_a03order AS a1
WHERE a1.city="city_A" AND DATE_FORMAT(a1.order_date,"%Y%m")=DATE_FORMAT(DATE_ADD(CURRENT_DATE,INTERVAL -1 DAY),"%Y%m")
GROUP BY a1.username,a1.order_date
) AS a2
GROUP BY a2.用户ID

2、上面代码把当月下单的客户名单找出来了 用户不重复,一行一个记录 我们以上面代码生成的字段 当月首单日 为基准 再用left join 订单表 去判断用户属性

SELECT a3.用户ID,a3.当月首单日,a3.销售员,
SUM(IF(a4.order_date<DATE_ADD(a3.当月首单日,INTERVAL -30 DAY),pay_money,NULL)) AS 当月首单日前30天之前订单额,
SUM(IF(a4.order_date>=DATE_ADD(a3.当月首单日,INTERVAL -30 DAY) AND a4.order_date<a3.当月首单日,pay_money,NULL)) AS 当月首单日前30天订单额,
SUM(IF(a4.order_date<a3.当月首单日,pay_money,NULL)) AS 当月首单日之前总订单额,
a3.当月首单额,
CASE
WHEN SUM(IF(a4.order_date<a3.当月首单日,pay_money,NULL)) IS NULL THEN "新增"#x1
WHEN SUM(IF(a4.order_date>=DATE_ADD(a3.当月首单日,INTERVAL -30 DAY) AND a4.order_date<a3.当月首单日,pay_money,NULL))IS NOT NULL THEN "留存"#x2
WHEN SUM(IF(a4.order_date<DATE_ADD(a3.当月首单日,INTERVAL -30 DAY),pay_money,NULL)) IS NOT NULL AND SUM(IF(a4.order_date>=DATE_ADD(a3.当月首单日,INTERVAL -30 DAY) AND a4.order_date<a3.当月首单日,pay_money,NULL))IS NULL THEN "重激活"#x3
ELSE NULL END 留存情况
FROM (
SELECT a2.用户ID,a2.订单日期 AS 当月首单日,a2.销售员,a2.订单额 AS 当月首单额#取当月首单日,当月首单销售员,当月首单额
FROM (
SELECT a1.username AS 用户ID,a1.order_date AS 订单日期,a1.salesperson AS 销售员,SUM(a1.pay_money) AS 订单额#当月每一天明细
FROM test_a03order AS a1
WHERE a1.city="city_A" AND DATE_FORMAT(a1.order_date,"%Y%m")=DATE_FORMAT(DATE_ADD(CURRENT_DATE,INTERVAL -1 DAY),"%Y%m")
GROUP BY a1.username,a1.order_date
) AS a2
GROUP BY a2.用户ID
) AS a3
LEFT JOIN test_a03order AS a4 ON a3.用户ID=a4.username#a3是在当月下单的用户 再去找这些用户在整个订单表的订单情况 以a3的当月首单日往前推算30天计算留存新增等属性
GROUP BY a3.用户ID

#x1 说明在当月首单日之前没下过单 这是新客户

#x2说明在当月首单日之前30天下过单 当月首单日距上次最后一次下单间隔不超过30天 这是留存客户

#x3说明在首单日前30天再之前下过单 在距离当月首单日30天内没下过单 重激活

实质上是数学上区间判断的问题 区间点包含不包含和运营人沟通一下就解决

区间节点分别为60之前,60,90

<=60 这段为a区间

(60,90)为b区间

=90 为c区间

<90为d 区间 代表a和b的全部区间

因此转化到区间判断上了 首先c区间肯定有金额 代表本月首单日金额

新增:d区间金额为空,c不为空 因此新下单

留存:b区间金额不为空 则留存

重激活:a区间金额不为空,b区间为空,c区间不为空 则重激活

MySQL-计算当月重新激活客户_20161013的更多相关文章

  1. mysql计算时间差函数

    MySql计算两个日期的时间差函数TIMESTAMPDIFF用法,只要用一句SQL语句就可以办到了. MySql计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDI ...

  2. MySQL计算销售员昨日各指标综合得分_20161206

    数据需求如上,新增重激活以15天未下单为界定 SELECT d.销售员,(日销售额得分*0.6+日新增客户数得分*0.15+日客单价得分*0.1+日客户平均产品数得分*0.15)AS 综合得分,日销售 ...

  3. MySQL计算时间差

    MySQL计算两个日期的时间差函数:TIMESTAMPDIFF 语法: TIMESTAMPDIFF(interval, datetime_expr1, datetime_expr2) interval ...

  4. Js计算-当月每周有多少天

    查看Demo: 源代码如下: <script> //计算当月总天数 function getCountDays() { var curDate = new Date(); /* 获取当前月 ...

  5. mysql计算连续天数,mysql连续登录天数,连续天数统计

    mysql计算连续天数,mysql连续登录天数,连续天数统计 >>>>>>>>>>>>>>>>>& ...

  6. mysql计算排名 转

    from :http://www.cnblogs.com/aeiou/p/5719396.html http://www.cnblogs.com/zengguowang/p/5541431.html ...

  7. MySql计算两个日期的时间差函数

    MySql计算两个日期时间的差函数: 第一种:TIMESTAMPDIFF函数,需要传入三个参数,第一个是比较的类型,可以比较FRAC_SECOND.SECOND. MINUTE. HOUR. DAY. ...

  8. mysql计算排名

    mysql计算排名,获取行号rowno 学生成绩表数据 SELECT * FROM table_score ORDER BY score DESC; 获取某个学生成绩排名并计算该学生和上一名学生成绩差 ...

  9. MySQL计算日期的函数DATE_SUB(d,INTERVAL expr type)

    MySQL计算日期的函数DATE_SUB(d,INTERVAL expr type) DATE_SUB(d,INTERVAL expr type)函数返回起始日期d减去一个时间段后的日期. expr是 ...

随机推荐

  1. 一套ui满足ios与android界面

    1.android 画布宽高720*1280的标准来切图生成xhdpi标准图,后自动生成mdpi.hdpi.xhdpi.xxhdpi四套图. 2.ios画布宽高640 x 1136的标准来切图生成xh ...

  2. SQLServer -- 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'T_FLOW'中的标识列指定显式值。

    SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NAME(XXX, XXX,..., XXX) SELECT XXX, XXX,..., XX ...

  3. EasyPlayerPro windows播放器在播放RTMP视频显示重复异常问题解决

    问题来源 2017.12.18 今日有杭州某教育领域客户反馈EasyPlayerPro在播放一个rtmp源时,画面显示异常的问题.截图如下: 问题复现 一番思考, 将显示格式改为D3D显示, 正常, ...

  4. android菜鸟学习笔记13----Android控件(二) 自定义控件简单示例

    有时候,可能觉得系统提供的控件太丑,就会需要自定义控件来实现自己想要的效果. 以下主要参考<第一行代码> 1.自定义一个标题栏: 系统自带的标题栏很丑,且没什么大的作用,所以我们之前会在o ...

  5. 九度OJ 1016:火星A+B (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4913 解决:1334 题目描述:     读入两个不超过25位的火星正整数A和B,计算A+B.需要注意的是:在火星上,整数不是单一进制的, ...

  6. mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案

    如果你是mac  ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在. 废话不多说,复制粘贴就是干!!!!~~~~~~~~ 第一步: 复 ...

  7. linux rsyncserver文件同步

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zqtsx/article/details/24254651 [root@zqtsx]# rpm -q ...

  8. Bitmaps

    核心知识点: 1.Bitmaps是一种特殊的“数据结构”,实质上是一个字符串,操作单元是位. 2.命令: a.setbit:设置值,只能存储0和1,适用二元判断类型 b.getbit:获取值 c.bi ...

  9. mysql忘记root密码或报错:ERROR 1044 (42000): Access denied for user ”@’localhost’ to database ‘xx‘

    有的时候忘记了root密码或其他用户的密码,登录的时候报错:ERROR 1044 (42000): Access denied for user ”@’localhost’ to database ' ...

  10. LeetCode:访问所有节点的最短路径【847】

    LeetCode:访问所有节点的最短路径[847] 题目描述 给出 graph 为有 N 个节点(编号为 0, 1, 2, ..., N-1)的无向连通图. graph.length = N,且只有节 ...