zoukankan      html  css  js  c++  java
  • MySQL-计算7月重新激活客户第二种方法_20161022

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

    (一)上次用的是取当月首单日期,往前推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

     

  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/Mr-Cxy/p/5986675.html
Copyright © 2011-2022 走看看