1.数据清洗

步骤:

1.查询charge_record表业务类型为充值且订单状态为成功的数据

2.将上述数据转移到本地数据库

使用如下脚本:

# coding=utf-8

import pymysql

# 原数据库链接

db1 = pymysql.connect(

host=‘***‘,

port=3306, user=‘***‘,

passwd=‘***‘,

db=‘***‘,

charset=‘utf8‘)

cursor1 = db1.cursor()

# 定义查询语句

len1 = cursor1.execute(‘select uid,update_time from charge_record where buss_type=0 and charge_status=2 and charge_prod_id is not null‘)

# 迁移数据库链接

db2 = pymysql.connect(

host=‘127.0.0.1‘,

port=3306, user=‘root‘,

passwd=‘123456‘,

db=‘test‘,

charset=‘utf8‘)

cursor2 = db2.cursor()

# 批量插入语句

sql = ‘insert into charge_record(uid,update_time) value(%s, %s)‘

# 导入全部数据

data2 = cursor1.fetchall()

cursor2.executemany(sql, data2)

# 提交到数据库

db2.commit()

# 关闭数据库连接

db1.close()

db2.close()

2.计算留存率

使用的MySQL语句如下:

USE test;

-- 计算首单时间

SELECT uid,min(update_time) u_time FROM charge_record GROUP BY uid;

-- 重采首付时间

SELECT a.uid,b.u_time,TIMESTAMPDIFF(MONTH,b.u_time,a.update_time) m_diff,CONCAT(YEAR(b.u_time),"年",MONTH(b.u_time),"月") y_m FROM charge_record a

LEFT JOIN (

SELECT uid,min(update_time) u_time FROM charge_record GROUP BY uid LIMIT 0,7000

) b on a.uid=b.uid WHERE b.u_time is NOT NULL;

-- 计算留存量

CREATE table cohort as

SELECT c.y_m "首付月份",c.m_diff"月份差",COUNT(DISTINCT c.uid) "留存量" FROM (

SELECT a.uid,b.u_time,TIMESTAMPDIFF(MONTH,b.u_time,a.update_time) m_diff,CONCAT(YEAR(b.u_time),"年",MONTH(b.u_time),"月") y_m FROM charge_record a

LEFT JOIN (

SELECT uid,min(update_time) u_time FROM charge_record GROUP BY uid

) b on a.uid=b.uid WHERE b.u_time is NOT NULL ) c GROUP BY c.y_m,c.m_diff;

-- 计算留存率

SELECT c.`首付月份`,CONCAT(ROUND((c.`留存量`/m.`留存量`)*100,2),"%") 留存率 FROM cohort c

LEFT JOIN (

SELECT 首付月份,留存量 FROM cohort WHERE `月份差`=0

) m on c.`首付月份`=m.`首付月份`;

-- 留存率进阶版

SELECT

n.`首付月份`,

AVG(n.`留存量`) "本月新增",

CONCAT(sum(n.`+1月`),"%") "+1月",

CONCAT(sum(n.`+2月`),"%") "+2月",

CONCAT(sum(n.`+3月`),"%") "+3月",

CONCAT(sum(n.`+4月`),"%") "+4月",

CONCAT(sum(n.`+5月`),"%") "+5月"

FROM (

# 一级子查询:转置表格,将月份差作为列名

SELECT

a.`首付月份`,

a.`留存量`,

CASE a.`月份差` when 1 THEN a.`留存率` ELSE 0 END "+1月",

CASE a.`月份差` when 2 THEN a.`留存率` ELSE 0 END "+2月",

CASE a.`月份差` when 3 THEN a.`留存率` ELSE 0 END "+3月",

CASE a.`月份差` when 4 THEN a.`留存率` ELSE 0 END "+4月",

CASE a.`月份差` when 5 THEN a.`留存率` ELSE 0 END "+5月"

FROM(

# 二级子查询:计算留存率

SELECT a.`首付月份`,b.`留存量`,a.`月份差`,ROUND((a.`留存量`/b.`留存量`)*100,2) 留存率

FROM cohort a

LEFT JOIN (

# 三级子查询:查询首月用户量

SELECT `首付月份`,`留存量`

FROM cohort

WHERE cohort.`月份差`=0

) b

on a.`首付月份`=b.`首付月份`

) a

) n

GROUP BY n.`首付月份`;

最终结果如下:

mysql留存率除了存储过程_基于MySQL分析线上充值留存率相关推荐

  1. mysql数据生产数据分析_基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程...

    基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程 课程目录 (1)SQL与数Ju分析;目录中文件数:23个 (1) 开课-课时3SQL与数Ju库的价值.flv (2) ...

  2. mysql读写分离 存储过程_基于maxscale的读写分离部署笔记

    使用maxscale搭建的读写分离架构,后期还可以再结合MHA做master的故障转移,这样业务层面上不需要做任何的改动即可. 基于connect方式的不要使用.从库延迟他还会继续分发请求过去,暂时不 ...

  3. mysql 数据日志分析_基于mysql数据库的日志分析系统

    现如今,日志已经成为了我们分析系统及相关服务的一个重要工具.而日志也具有其相对较为固定的格式以便于进行统计查询.其大致格式如下: 日期时间            主机            进程[pi ...

  4. elasticsearch 数据类型_基于 MySQL Binlog 的 Elasticsearch 数据同步实践

    来源;马蜂窝 一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存 ...

  5. mysql查询语句详解_基于mysql查询语句的使用详解

    1> 查询数据表除了前三条以外的数据. 起初我想到的是这条语句 SELECT * FROM admin WHERE userid NOT IN (SELECT userid FROM admin ...

  6. keepalived mysql双主架构图_基于MySQL双主的高可用解决方案理论及实践

    MySQL在互联网应用中已经遍地开花,但是在银行系统中,还在生根发芽的阶段.本文记录的是根据某生产系统实际需求,对数据库高可用方案从需求.各高可用技术特点对比.实施.测试等过程进行整理,完善Mysql ...

  7. mysql数据库约束详解_基于MySQL数据库的数据约束实例及五种完整性约束介绍

    为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. ...

  8. mysql 创建带参数的存储过程_在MySQL中创建带有IN和OUT参数的存储过程的方法

    在 MySQL 中创建储存过程的语法很难记,除非你经常跟储存过程打交道,原因很简单,语法不是什么小笑话.如果你通过命令行控制 MySQL,你需要记住准确的语法.一个快速示例可以很好的帮助你做到这点.在 ...

  9. vsftp服务器mysql认证_基于mysql控制vsftp的用户认证机制

    一.简介 vsftpd 是"very secure FTP daemon"的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以 ...

  10. mysql研究内容_基于MySQL数据库的数据管理的研究

    [摘 要]MySQL 是一种开放源代码的关系型数据库管理系统,MySQL数据库系统使用最常用的数据库管理语言,即结构化查询语言进行数据库管理.缓存管理是对于文件数据在内存中的特殊管理,基于内存管理,向 ...

最新文章

  1. 1.8 centos7 的PATH、cp/mv/文档查看命令介绍
  2. iptables防火墙的基本配置
  3. 第一部分:基础知识(第一章)屏幕部分续
  4. 搭建WAMP 环境时,解决Windows下输入localhost找不到网页的问题
  5. 「软件项目管理」成本估算模型——Walston-Felix模型和COCOMO Ⅱ模型
  6. linux中断pollselcet按键处理机制
  7. php ci框架 模板引擎,详解CodeIgniter框架实现的整合Smarty引擎DEMO
  8. MySQL的安全设定
  9. series、dataframe转为tensor格式数据
  10. JVM调优日志解析分析
  11. 02 Apache Solr: 概览 Solr在信息系统架构中的位置
  12. Unity 宣布正式收购 Weta Digital
  13. L1-013 计算阶乘和 (10 分)—团体程序设计天梯赛
  14. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)
  15. c# 模拟串口通信 SerialPort
  16. 使用Typora添加数学公式
  17. Windows——打印机错误(操作无法完成(错误 0x000006ba)。本地打印机后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。)解决方案
  18. 鸿蒙系统手机如何投影,小屏如何换大屏 五种方法教你把手机画面投影到电视上...
  19. 如何学习人工智能,学习AI的一般路线
  20. Android 插件化开发——宿主APP加载APK插件

热门文章

  1. position absolute定位之所属的containing box
  2. 关于handler的再次讨论
  3. POJ 1873 The Fortified Forest
  4. 【Sql查询数据】for 日、月、年
  5. Real World Haskell 第四章 函数式编程
  6. 土豆首页图片延迟加载的效果
  7. 毕业后,她用1年时间拿下了30W年薪的阿里数据分析岗
  8. 【经典案例】Python详解设计模式:策略模式
  9. 在Windows下的virtualenv中搭建Flask+MySQLDb开发环境
  10. 笔谈FFmpeg(二)