上周日休假去广西玩了一周,回来继续。

(一)上次用的是取当月首单日期,往前推30天 代码比较繁琐 这次方法是借助变量 错行进行判断 一个用户上次最后一次下单时间和下次下单时间的时间差

也就是形成一个相差天数的字段和第几天次的字段  去判断用户的留存激活新增属性

SQL代码如下

SELECT *, SUM(IF(上次金额 IS NULL,(@k := 1),(@k :=@k + 1))) AS 第几天次
FROM(
SELECT b.*, c.订单日期 AS 上次订单日期,c.金额 AS 上次金额,TIMESTAMPDIFF(DAY,c.订单日期 ,b.订单日期) AS 相差天数
FROM(
SELECT a.*,(@i :=@i + 1) AS ID1
FROM (
SELECT city AS 城市,username AS 用户ID,order_date AS 订单日期,SUM(pay_money) AS 金额
FROM `test_a03order`
GROUP BY city,username,order_date
ORDER BY city,username,order_date
) AS a,(SELECT @i := 0) AS a1
) AS b
LEFT JOIN (
SELECT a.*,(@j :=@j + 1) AS ID2
FROM (
SELECT city AS 城市,username AS 用户ID,order_date AS 订单日期,SUM(pay_money) AS 金额
FROM `test_a03order`
GROUP BY city,username,order_date
ORDER BY city,username,order_date
) AS a,(SELECT @j := 1) AS a2
)AS c ON b.用户ID=c.用户ID AND ID1=ID2
) AS d
GROUP BY id1

(二)上面的表当做一个子表 case when 进行条件判断 计算下7月份各城市用户ID的留存情况

SELECT  城市,用户ID,订单日期,
CASE WHEN 第几天次=1 THEN "新增"
WHEN 相差天数 IS NOT NULL AND 相差天数<=30 THEN "留存"
WHEN 相差天数>30 THEN "重新激活" ELSE NULL END AS 激活情况
FROM (
SELECT *, SUM(IF(上次金额 IS NULL,(@k := 1),(@k :=@k + 1))) AS 第几天次
FROM(
SELECT b.*, c.订单日期 AS 上次订单日期,c.金额 AS 上次金额,TIMESTAMPDIFF(DAY,c.订单日期 ,b.订单日期) AS 相差天数
FROM(
SELECT a.*,(@i :=@i + 1) AS ID1
FROM (
SELECT city AS 城市,username AS 用户ID,order_date AS 订单日期,SUM(pay_money) AS 金额
FROM `test_a03order`
GROUP BY city,username,order_date
ORDER BY city,username,order_date
) AS a,(SELECT @i := 0) AS a1
) AS b
LEFT JOIN (
SELECT a.*,(@j :=@j + 1) AS ID2
FROM (
SELECT city AS 城市,username AS 用户ID,order_date AS 订单日期,SUM(pay_money) AS 金额
FROM `test_a03order`
GROUP BY city,username,order_date
ORDER BY city,username,order_date
) AS a,(SELECT @j := 1) AS a2
)AS c ON b.用户ID=c.用户ID AND ID1=ID2
) AS d
GROUP BY id1
) AS e
WHERE DATE_FORMAT(e.订单日期,"%Y%m")=201607

MySQL-计算7月重新激活客户第二种方法_20161022的更多相关文章

  1. iOS 清理缓存功能的实现第二种方法

    /** * 清理缓存第二种方法 * * @param sender <#sender description#> */ - (void)clearCache:(id)sender { // ...

  2. MYSQL插入处理重复键值的几种方法

    当unique列在一个UNIQUE键上插入包含重复值的记录时,默认insert的时候会报1062错误,MYSQL有三种不同的处理方法,下面我们分别介绍. 先建立2个测试表,在id列上创建unique约 ...

  3. MySQL修改数据表存储引擎的3种方法介绍

    这篇文章主要介绍了MySQL修改数据表存储引擎的3种方法介绍,分别是直接修改.导出导入.创建插入3种方法, 可以参考下   MySQL作为最常用的数据库,经常遇到各种各样的问题.今天要说的就是表存储引 ...

  4. 二、用Delphi10.3 创建一条JSON数据的第二种方法,并格式化输出

    一.用Delphi10.3构造一个JSON数据的第二种方法,并格式化输出,代码如下: uses //System.JSON, System.JSON.Types, System.JSON.Writer ...

  5. 在MySQL中设置事务隔离级别有2种方法:

    在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...

  6. HOSt ip is not allowed to connect to this MySql server, MYSQL添加远程用户或允许远程访问三种方法

    HOSt ip is not allowed to connect to this MySql server 报错:1130-host ... is not allowed to connect to ...

  7. C#计算一段程序运行时间的三种方法

    第一种方法利用System.DateTime.Now: static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代 ...

  8. MYSQL获取自增主键【4种方法】

    通常我们在应用中对mysql执行了insert操作后,需要获取插入记录的自增主键.本文将介绍java环境下的4种方法获取insert后的记录主键auto_increment的值: 通过JDBC2.0提 ...

  9. MYSQL获取自增主键【4种方法】(转)

    转自:http://blog.csdn.net/ultrani/article/details/9351573 作者已经写的非常好了,我不废话了,直接转载收藏: 通常我们在应用中对mysql执行了in ...

随机推荐

  1. sealed,new,virtual,abstract与override关键字的区别?

    1. sealed——“断子绝孙” 密封类不能被继承.密封方法可以重写基类中的方法,但其本身不能在任何派生类中进一步重写.当应用于方法或属性时,sealed修饰符必须始终与override一起使用. ...

  2. pooler 连接池中报错" error_no_members"

    连接池驱动,pooler 在使用中会报错" error_no_members" 分析:可能有以下3个地方对其有影响:    1)member 可能没回收: 2)wait_for_p ...

  3. 深入Asyncio(八)异步迭代器

    Async Iterators: async for 除了async def和await语法外,还有一些其它的语法,本章学习异步版的for循环与迭代器,不难理解,普通迭代器是通过__iter__和__ ...

  4. mac上利用minikube搭建kubernetes(k8s)环境

    友情提示:对于初次接触k8s的同学,强烈建议先看看本文最后的参考文章. 环境: mac os(Mojave) 前提:先安装好kubectl (brew install kubectl) .docker ...

  5. 一个中断服务子程序ISR

    请看下面的程序(一个中断服务子程序ISR),请指出这段代码的错误.)[中国台湾某著名CPU生产公司2005年面试题] 答案:(1)ISR不能返回一个值.如果你不懂这个,那么是不会被雇用的.(2)ISR ...

  6. MySQL重置root用户密码的方法【亲测可用】

    1. 报错截图 2.当确认已经忘记MySQL密码,则可以通过以下方案重置root用户密码.双击打开C:\Program Files\MySQL\MySQL Server 5.1\my.ini文件,如下 ...

  7. 数据结构---python---表

    一.list的基本实现技术 在数据结构中,如果用python实现线性表,无疑要提到list,list是一种元素个数可变的线性表(而tuple是不变的表,不支持改变其内部状态的任何操作,其他与list性 ...

  8. Runnable 和 Callable的区别

    Runnable 与 Callable的区别: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable ...

  9. 九度OJ 1148:Financial Management(财务管理) (平均数)

    与1141题相同. 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:843 解决:502 题目描述: Larry graduated this year and finally has a ...

  10. Azkaban_Oozie_action

    http://azkaban.github.io/azkaban/docs/2.5/ There is no reason why MySQL was chosen except that it is ...