MySQL-计算当月重新激活客户_20161013

  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#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区间不为空 则重激活

时间: 2024-10-27 11:35:42

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

MySQL计算字段

计算字段 数据库中存放的表是按列存放,但是有时客户机想获得的信息是若干列之间的组合,或者求和的值.这个组合或者求和的动作可以放在客户机应用程序来做,但是在数据库中实现更为高效.这个新计算出来的结果就称为字段. 例如我们需要vend的name后面用括号说明所属国家.则可以实现如下,使用MySQL的Concat拼接函数实现拼接: 但是这仅仅是得到了一个值,没有相应的名称,客户机上的应用程序没法引用这个结果.因此使用别名来命令这个新获得的字段以供客户机应用程序调用,别名使用as 后接别名名称: 除了合

Mysql 计算时间间隔函数

#计算两个时间的间隔 #计算间隔天数 select TIMESTAMPDIFF(day,'2014-06-01',date(now())) #计算间隔月数 select TIMESTAMPDIFF(month,'2014-01-01',date(now())) #计算间隔年数 select TIMESTAMPDIFF(year,'2010-01-01',date(now()))Mysql 计算时间间隔函数,布布扣,bubuko.com

mysql计算排名

mysql计算排名,获取行号rowno 学生成绩表数据 SELECT * FROM table_score ORDER BY score DESC; 获取某个学生成绩排名并计算该学生和上一名学生成绩差,是并列排名 SELECT *, (SELECT count(DISTINCT score) FROM table_score AS b WHERE a.score<b.score)+1 AS rank, #获取排名,并列 (SELECT b.score FROM table_score AS b

mysql计算时间差函数

MySql计算两个日期的时间差函数TIMESTAMPDIFF用法,只要用一句SQL语句就可以办到了. MySql计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)   说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差.其结果的单位由interval 参数给出.interval 的法定值同TIMESTAMPADD(

MySQL计算时间差

MySQL计算两个日期的时间差函数:TIMESTAMPDIFF 语法: TIMESTAMPDIFF(interval, datetime_expr1, datetime_expr2) interval取值: SECOND     秒 MINUTE     分钟HOUR         小时DAY            天MONTH     月 YEAR           年 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2之间的整数差.其结果的单位由

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

MySql计算两个日期时间的差函数: 第一种:TIMESTAMPDIFF函数,需要传入三个参数,第一个是比较的类型,可以比较FRAC_SECOND.SECOND. MINUTE. HOUR. DAY. WEEK. MONTH. QUARTER或 YEAR几种类型,第二个和第三个参数是待比较的两个时间,比较是后一个时间减前一个时间,具体用法如下: SELECT TIMESTAMPDIFF(DAY,'2012-10-01','2013-01-13'); 返回结果是104,这里比较的是两个时间的天数差

个人计算、分布式计算与客户/服务器计算

1.5 个人计算.分布式计算与客户/服务器计算 1977年,Apple计算机公司使个人计算(personal computer)得以普及.最初,拥有一台计算机只是爱好者的梦想,随着它的价格不断降低,人们可以购买供个人或办公使用的计算机.1981年,世界上最大的计算机广家IBM公司推出了IBM个人计算机(IBM Personal computer).一夜之间,个人计算机遍布公司.企业和政府机关. 然而这些计算机只是“独立”的个体,各自做自己的工作,要通过磁盘复制来共享信息(通常称为暗联网).尽管早

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数 计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() 实现. 函数 TimeStampDiff() 是MySQL本身提供的可以计算两个时间间隔的函数,语法为: TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之

mysql计算经纬度亮点之间的距离

1.计算距离的公式比较长(网上查找),建一个mysql函数: delimiter $$ CREATE FUNCTION FUN_JW_DIST(lng1 double(15,9), lat1 double(15, 9), lng2 double(15,9), lat2 double(15,9)) RETURNS double(15,9) BEGIN DECLARE dist double(15, 9); SET dist = round(6378.138*2*asin(sqrt(pow(sin(