基于MySQL分析线上充值留存率
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+MHA+Haproxy构建高可用负载均衡数据库集群(详解)
这里我们先介绍一下MHA是什么,其次就是它的应用与测试,同时为了大家呈现了数据备份案例,最后总结了使用情况以及注意事项和解决办法 一.MHA 概述 MHA(Master High Availabili ...
- 一个基于mysql构建的队列表
通常大家都会使用redis作为应用的任务队列表,redis的List结构,在一段进行任务的插入,在另一端进行任务的提取. 任务的插入 $redis->lPush("key:task:l ...
- Cobar_基于MySQL的分布式数据库服务中间件
Cobar是阿里巴巴研发的关系型数据的分布式处理系统,是提供关系型数据库(MySQL)分布式服务的中间件,该产品成功替代了原先基于Oracle的数据存储方案,它可以让传统的数据库得到良好的线性扩展,并 ...
- 基于MySQL协议的数据库中间层项目Atlas - 360团队
一.简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了 ...
- 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇
Eclipse Memory Analyzer Tool(MAT)相关文章目录: 使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一) - 视图&功能篇 使 ...
- Mysql Explain 解读(基于MySQL 5.6.36)
Mysql Explain 解读(基于MySQL 5.6.36) 1.语法 explain < table_name > #例子 explain select * from t3 wher ...
- 搭建基于MySQL的读写分离工具Amoeba
搭建基于MySQL的读写分离工具Amoeba: Amoeba工具是实现MySQL数据库读写分离的一个工具,前提是基于MySQL主从复制来实现的: 实验环境(虚拟机): 主机 角色 10.10.10.2 ...
- Hive安装与配置--- 基于MySQL元数据
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...
- 秒杀怎么样才可以防止超卖?基于mysql的事务和锁实现
Reference: http://blog.ruaby.com/?p=256 并发事务处理带来的问题? 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从 ...
- 基于MySQl的分页显示
<%@page import="java.sql.DriverManager"%> <%@page import="java.sql.ResultSet ...
随机推荐
- 某教育网站疑似删库。。。没备份。。。数据全没了。。。Sealos 带你一分钟满血复活
2025 年 1 月 15 日,微信群里有人爆料,某教育网站疑似删库,导致网站无法访问.具体的问题是数据库被格式化了,而且也没有备份,连数据库表结构都没有,不仅业务瘫痪,也无法拉起新的应用,实在是有点 ...
- NSSM使用说明
1.说明 NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行.同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大.它的特点如下: ...
- shell 数组函数进阶练习
一维数组的定义.统计.引用和删除等操作. A=( test1 test2 test3 ) ,定义数组一般以括号的方式来定义, 数组的值可以随机定义. echo ${A[0]} ,代表引用第一个数组变量 ...
- vue-element-template实现顶部菜单栏
一.框架侧边栏改为顶部导航栏 1.复制src/layout/componets/Sidebar所有文件至同级目录,改名为Headbar 2.src/layout/components/index.js ...
- Luogu P3041 USACO12JAN Video Game G 题解 [ 紫 ] [ AC 自动机 ] [ 动态规划 ]
Video Games G:弱智紫题,30min 切了,dp 思路非常板. 多模式串一看肯定就是要建出 AC 自动机,然后在 fail 树里下传标记,预处理每个节点到达后的得分. 然后设计 \(dp_ ...
- nginx出现: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误
问题情况 登陆服务器之后进到nginx使用./nginx -s reload重新读取配置文件,发现报==nginx: [error] open() "/usr/local/nginx/log ...
- 软件工程: SDLC V模型
V型 V-model 代表一个开发过程,可以被认为是瀑布模型的扩展,是更通用的 V-model 的一个例子.不是以线性方式向下移动,而是在编码阶段之后向上弯曲工艺步骤,以形成典型的 V 形.V 模型展 ...
- Win10、Win11老游戏运行补丁(cnc-ddraw),适用于红色警戒、帝国时代等经典游戏
Win11.Win10老游戏运行补丁(cnc-ddraw),适用广泛,红色警戒(红警),直接复制到游戏目录,然后即可畅玩.再也不需要修改:管理员运行,兼容性运行,更改DPI.cnc-ddraw 可以修 ...
- NebulaGraph Desktop 使用初体验
前言 前两天 NebulaGraph 官方宣布了全新的开源 Desktop,旨在通过一体化方案解决图数据库部署复杂.工具碎片化.学习成本高等的痛点问题,我也是跃跃欲试.前期在初识 NebulaGrap ...
- 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明)
3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明) @ 目录 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截 ...