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分析线上充值留存率的更多相关文章

  1. 【线上测试之后的应用】基于MySQL+MHA+Haproxy构建高可用负载均衡数据库集群(详解)

    这里我们先介绍一下MHA是什么,其次就是它的应用与测试,同时为了大家呈现了数据备份案例,最后总结了使用情况以及注意事项和解决办法 一.MHA 概述 MHA(Master High Availabili ...

  2. 一个基于mysql构建的队列表

    通常大家都会使用redis作为应用的任务队列表,redis的List结构,在一段进行任务的插入,在另一端进行任务的提取. 任务的插入 $redis->lPush("key:task:l ...

  3. Cobar_基于MySQL的分布式数据库服务中间件

    Cobar是阿里巴巴研发的关系型数据的分布式处理系统,是提供关系型数据库(MySQL)分布式服务的中间件,该产品成功替代了原先基于Oracle的数据存储方案,它可以让传统的数据库得到良好的线性扩展,并 ...

  4. 基于MySQL协议的数据库中间层项目Atlas - 360团队

    一.简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了 ...

  5. 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇

    Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...

  6. Mysql Explain 解读(基于MySQL 5.6.36)

    Mysql Explain 解读(基于MySQL 5.6.36) 1.语法 explain < table_name > #例子 explain select * from t3 wher ...

  7. 搭建基于MySQL的读写分离工具Amoeba

    搭建基于MySQL的读写分离工具Amoeba: Amoeba工具是实现MySQL数据库读写分离的一个工具,前提是基于MySQL主从复制来实现的: 实验环境(虚拟机): 主机 角色 10.10.10.2 ...

  8. Hive安装与配置--- 基于MySQL元数据

    hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...

  9. 秒杀怎么样才可以防止超卖?基于mysql的事务和锁实现

    Reference:  http://blog.ruaby.com/?p=256 并发事务处理带来的问题? 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从 ...

  10. 基于MySQl的分页显示

    <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.ResultSet ...

随机推荐

  1. Huawei LiteOS基于Cortex-M4 GD32F4平台移植

    1.Huawei LiteOS简介 Huawei LiteOS源码获取: https://github.com/LiteOS/LiteOS, https://gitee.com/LiteOS/Lite ...

  2. 第9章 LINQ 运算符

    第9章 LINQ 运算符 本章所有例子所使用的 names 数组都是一致的: string[] names = {"Tom", "Dick", "Ha ...

  3. Q:LISTAGG()函数用法笔记(oracle)

    .LISTAGG()函数作为普通函数使用时就是查询出来的结果列转为行 ☆LISTAGG 函数既是分析函数,也是聚合函数有两种用法:1.分析函数,如: row_number().rank().dense ...

  4. 创建Graphics对象的三种方法

    参考链接:https://www.cnblogs.com/wax01/p/4982691.html 方法一.利用控件或窗体的Paint事件中的PainEventArgs 在窗体或控件的Paint事件中 ...

  5. autMan奥特曼机器人-对插件权限的管理

    为了避免某些插件在用户不知情的情况下读取使用用户隐私数据,受" 安卓手机上安装的应用需申请电话.位置.通讯录等权限 "的启发,autMan增加了数据桶读取权限设置页面. 当前受限制 ...

  6. Ubuntu详细的安装和配置ssh教程

    Ubuntu安装和配置ssh的步骤如下: 打开终端,输入以下命令安装ssh: sudo apt-get install openssh-server 安装完成后,启动ssh服务: sudo syste ...

  7. mybatis - [05] Mybatis的CURD

    数据库:mysql 8.0.28 技术框架:mybatis 3.5.13.maven 3.8.7 一.准备工作 (1)数据库建库建表 -- 创建数据库 create database if not e ...

  8. mybatis - [09] 动态SQL

    题记部分 一.if & test 如果id,name,age不为空,则按照指定的值进行查询.如果这三者都是空(null和空字符串),则该sql执行结果为全表查询的结果集. <select ...

  9. 2024.11.19随笔&联考总结

    联考 看到 T1 就知道一定是简单计数题然后发现 \(O(n)\) 可以过于是就大概写了写式子就开写.写的过程中犯了一些低级错误,代码重构了一次才过.耽误的时间比较久.然后开 T2,一眼有一个 \(O ...

  10. 在Vue 3中创建和使用FormData对象

    在Vue 3中创建和使用FormData对象的具体步骤如下‌: ‌创建FormData对象‌:在Vue组件中,首先需要创建一个新的FormData对象.FormData是一个内置的JavaScript ...