MySQL实现7天,15天,30天,90天用户留存数量查询

2023-10-27

如何计算用户留存率

新增用户留存率=新增用户中登录用户数/新增用户数*100%(一般统计周期为天)

新增用户数:在某个时间段(一般为第一整天)新登录应用的用户数;

登录用户数:登录应用后至当前时间,至少登录过一次的用户数;

第N日留存:指的是新增用户日之后的第N日依然登录的用户占新增用户的比例

第1日留存率(即“次留”):(当天新增的用户中,新增日之后的第1天还登录的用户数)/第一天新增总用户数;

第3日留存率:(当天新增的用户中,新增日之后的第3天还登录的用户数)/第一天新增总用户数;

第7日留存率:(当天新增的用户中,新增日之后的第7天还登录的用户数)/第一天新增总用户数;

第30日留存率:(当天新增的用户中,新增日之后的第30天还登录的用户数)/第一天新增总用户数;

查询SQL

SELECT
	create_time as '日期',
	count(id) '新增数量',
	count(id1)  '7日留存',
	count(id2) '15日留存',
	count(id3) '30日留存',
	count(id4)  '90日留存'
FROM
(SELECT	DISTINCT
	u.create_time,u.idx_user_id as id,u1.idx_user_id as id1,u2.idx_user_id as id2,u3.idx_user_id as id3,u4.idx_user_id as id4
FROM
(SELECT DISTINCT 
	min(Date(create_time)) create_time , idx_user_id,cost_status
FROM
	tbconsumerecord
WHERE 
cost_status=1 
GROUP BY 
	idx_user_id) u
LEFT JOIN 
	tbconsumerecord u1 
ON DATEDIFF(DATE(u1.create_time),u.create_time) = 7 AND u.idx_user_id=u1.idx_user_id
LEFT JOIN 
	tbconsumerecord u2 
ON DATEDIFF(DATE(u2.create_time),u.create_time) = 15 AND u.idx_user_id=u2.idx_user_id
LEFT JOIN 
	tbconsumerecord u3 
ON DATEDIFF(DATE(u3.create_time),u.create_time) = 30 AND u.idx_user_id=u3.idx_user_id
LEFT JOIN 
	tbconsumerecord u4
ON DATEDIFF(DATE(u4.create_time),u.create_time) = 90 AND u.idx_user_id=u4.idx_user_id
)as user
GROUP BY
create_time;

 

 

 函数解释

  • MySQL DATEDIFF函数计算两个DATE,或TIMESTAMP值之间的天数。

    MySQL DATEDIFF函数的语法如下:

  • 用于返回计算两个日期指定单位的时间差(指定单位可以是年,季度,月,星期,天数,小时,分钟,秒等等)

  • SELECT DATEDIFF('2023-06-12', '2023-06-05') as Intervaltime;

    输出结果:7

    ##日期函数 DATE_ADD(date,INTERVAL expr unit)  date 日期  INTERVAL expr 间隔 

    负数往前  正数往后 unit 时间单位 day 天 hour 小时 minute 分钟

    ##day 天

    select date_add('2023-06-10',INTERVAL '5' day) as afterDay;

     

    select date_add('2023-06-10',INTERVAL '-5' day) as beforeDay;

     

    ##hour 小时

    select date_add('2023-06-10',INTERVAL '5' hour) as afterHour;

     

    select date_add('2023-06-10',INTERVAL '-5' hour) as beforeHour;

     

    ##minute 分钟

    select date_add('2023-06-10',INTERVAL '5' minute) as afterMinute;

     

    select date_add('2023-06-10',INTERVAL '-5' minute) as beforeMinute;

     

 

##每天新增用户数据
select a.date, count(b.user_id) from
-- 日期表
(select distinct Date(create_time) as date from tbconsumerecord) a left join 
 -- 左连接日期不全的查询结果
(select idx_user_id user_id, min(Date(create_time)) as date from tbconsumerecord WHERE cost_status=1  group by idx_user_id ) b 
on a.date = b.date
group by a.date;

select *
FROM    tbconsumerecord
WHERE Date(create_time)='2023-03-06' or Date(create_time)='2023-04-14';

第一橙色部分含义:先查询该表所有日期

第二橙色部分含义:查询用户最小登录日期(当前用户第一次登录即为新增用户)

##每天新增用户数据
select a.date, count(b.user_id) as count from
-- 日期表
(select distinct Date(create_time) as date from tbconsumerecord 
union
select distinct Date(create_time) as date from tbconsumerecord_old
 ) a left join 
 -- 左连接日期不全的查询结果
(select idx_user_id user_id, max(Date(create_time)) as date from tbconsumerecord WHERE cost_status=1 group by idx_user_id
union
select idx_user_id user_id, max(Date(create_time)) as date from tbconsumerecord WHERE cost_status=1 group by idx_user_id

) b 
on a.date = b.date
group by a.date;

由于第一张表只存了当月数据,所以需要并上另外一张表数据结果去重

新增用户查询结果如下

 

验证结果的正确性

前两条数据代表同一个用户不同日期登录,第一次登录2023-03-06,第二次登录2023-04-14

所以该用户新增的日期为2023-03-06.

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL实现7天,15天,30天,90天用户留存数量查询 的相关文章

  • 如何避免此 PDO 异常:当其他未缓冲的查询处于活动状态时无法执行查询

    我想在我的页面中打印一个包含 3 列的简单表格 building name tags and architecture style 如果我尝试检索列表building names and arch styles没有问题 SELECT bui
  • NodeJS MySQL - 如何知道连接是否释放

    我正在开发 NodeJS MySQL Web API 我在用mysql https www npmjs com package mysqlnpm 模块 我想知道连接是否已释放 是否有任何函数或变量 喜欢 if connection isRe
  • 如何限制 SQLite / MySQL 中的列值

    我想限制表中的列值 例如 列值只能是car or bike or van 我的问题是如何在 SQL 中实现这一点 在数据库端执行此操作是一个好主意还是应该让应用程序限制输入 我还打算在将来添加或删除更多值 例如 truck 我使用的数据库类
  • 如何让MySQL数据库完全在内存中运行?

    我注意到我的数据库服务器支持内存数据库引擎 我想让一个已经运行 InnoDB 的数据库完全在内存中运行以提高性能 我怎么做 我探索了 PHPMyAdmin 但找不到 更改引擎 功能 假设您了解注释中提到的使用 MEMORY 引擎的后果 并且
  • SQL IN 子句比单个查询慢

    我正在使用 Hibernate 的 JPA 实现和 MySQL 5 0 67 MySQL 配置为使用 InnoDB 在执行 JPA 查询 转换为 SQL 时 我发现使用IN子句比执行单个查询慢 例子 SELECT p FROM Person
  • 如何在MySQL查询结果中显示序号

    我有一些简单的查询 SELECT foo bar FROM table 我想你现在的结果是什么样的 我想要做的是根据查询结果中出现的数据数量来显示一些序列号 就像AUTO INCREMENT 这并不意味着我想出示身份证 我想要的结果是这样的
  • 如何从准备好的语句中获取标量结果?

    是否可以将准备好的语句的结果设置为变量 我正在尝试创建以下存储过程 但失败了 第 31 行出现错误 1064 42000 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 stmt USING m c a 附
  • 在MySQL中永久设置auto_increment_offset

    我以 root 身份运行命令 set auto increment offset 2 但从其他连接上看不到效果 为什么不 它是全球性的 From http dev mysql com doc refman 5 1 en replicatio
  • SQL查询获取列的精度值

    我需要一个 SQL 查询来获取某些列的精度值 我主要关心十进制类型列 并且我需要相同的精度值 我意识到在某些版本和数据库服务器供应商中可以这样做 如果您能列出其中的一些 那就太好了 对于 SQL 服务器 select precision f
  • MYSQL:如何从姓氏中找到player_id?

    我现在尝试使用非标准化 摘要 表中的数据填充 testMatch 表 如下 测试匹配表 Field Type Null Key Default Extra match id int 11 NO PRI NULL match date dat
  • sql查询中where子句中的CASE语句

    我正在尝试在我正在处理的查询的 where 子句中编写一个 case 语句 我正在水晶报告中导入代码 我基本上是想说明变量 类型 是否设置为 创建 以便在where子句中为该日期范围运行 否则为不同的日期范围运行 它一直给我一个错误 我似乎
  • 存储过程 EXEC 与 sp_executesql 的区别?

    我写了两个存储过程 其中一个是sp executesql而其他没有 sp executesql 两者都正确执行相同的结果 我不明白两者之间有什么区别 EXEC SQL 与 EXEC sp executesql SQL N eStatus v
  • 无法将代码优先迁移应用到 mysql 数据库

    我正在使用 EF 代码优先模型开发 asp net mvc 我正在尝试首先使用 EF 代码将迁移应用到我的项目中 我正在使用 MySql 数据库 目前我使用的是 EF 4 3 1 版本和 6 6 4 0 版本的 mysql Connecto
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • SQL查询3个表,无法得到所需的结果

    列出所有已售出的作品以及艺术家 订购日期和发货日期 SELECT title artist order date ship date FROM items orders orderline WHERE orders order id ord
  • Oracle 函数编译成功,但在执行 PLS-00221 时抛出错误:不是过程或未定义

    我有简单的oracle功能 create or replace function abs test func test in in number return number is test out number BEGIN test out
  • PHP 和 MySQLi 中没有选择数据库错误[重复]

    这个问题在这里已经有答案了 我必须从 MySQL 数据库中选择数据 我一直在寻找答案 但仍然没有找到 我正在学习W3School http www w3schools com php php mysql select asp 我的 MySQ
  • 有向图 SQL

    我有以下数据集 它表示有向图中的节点 CREATE TABLE nodes NODE FROM VARCHAR2 10 NODE TO VARCHAR2 10 INSERT INTO nodes VALUES GT TG INSERT IN
  • 在带有 OR 条件的 LEFT JOIN 中使用索引

    考虑以下查询 SELECT FROM table1 LEFT JOIN table2 ON table2 some primary key table1 some primary key LEFT JOIN table3 ON table3
  • 重新排列mysql中的主键

    从MySQL表中删除一些行后如何重新排列主键列值 例如 一个包含 4 行数据的表 主键值为 1 2 3 4 当删除第2行和第3行时 第4行的键值变为2 请帮助我找到解决方案 为什么要这样做 你不需要重新排列您的密钥 因为它只是记录的数字和标

随机推荐

  • scipy提示GLIBCXX缺失,‘GLIBCXX_3.4.29‘ not found (required by xxx)

    credit https askubuntu com q 1393285 https askubuntu com a 1422639 使用ubuntu的test toolchain发布源 sudo add apt repository pp
  • SpringBoot 集成 Swagger 3.0 和 knife4j 文档教程

    SpringBoot 项目集成 Swagger 3 0 文档 添加依赖 在 SpringBoot 项目中 在 pom 文件中添加 Swagger 3 0 的依赖
  • Node.js中的回调函数详解

    Node js中的回调函数详解 回调函数概述 回调函数定义 回调函数主要用途 回调函数用法 回调函数基本格式 简单的回调函数实例 执行顺序理解 回调函数实例 回调函数概述 回调函数在很多地方都有用到 本文主要介绍Node js的回调函数 主
  • spring:集成JDBC

    spring作为一站式框架 提供了控制层的 SpringMVC 和 持久层的 Spring JdbcTemplate 1 导入相关的jar包 pom xml mysql
  • tomcat 和 jboss的热部署(热发布)问题

    所谓的热部署 热发布 下面称为 热部署 就是说 在web工程发布之后 不可避免的 会遇到修改BUG的问题 现在的热部署就是为了解决这个问题 其功能就是说 在不停止web服务的同时 对jsp和java类进行修改 修改后的效果同时还能够在页面上
  • 改变python默认版本方法

    通过软链接命令 ln 此方法为系统级修改 先删除默认的Python软链接 sudo rm rf usr bin python 然后创建一个新的软链接指向需要的Python版本 sudo ln s usr bin python3 usr bi
  • 在idea中启动Vue项目报错Love-Swiper

    今天在重新配置idea时出现的这个错误 由于已经修改完毕 无法重现 大概报错为 Love Swiper 主要错误原因时没有安装vue的这个组件 使用以前语句即可 npm i vue awesome swiper save ignore sc
  • linux中python操作redis读取数据写入文件

    编写python脚本 扫描redis中终端在线集合和查询终端状态表 在redis中 终端在线集合是有序集合存储方式 成员是终端状态表名 终端状态表以hash方式存储 是一个string类型的field和value的映射表 1 脚本第一行是指
  • 常见伪代码指令及使用

    1 声明statement 1 1 Assignment statement赋值语句 variable expression e g将表达式3 4赋给变量result result 3 4 1 2 compound statements 复
  • 2维正态分布-矩阵表示-推导过程

  • 国内主流在用的10大后台UI框架,私活必备

    目录 vue Element Admin AdminLTE ant design pro tabler ng2 admin Gentelella iview admin blur admin vue admin material dashb
  • 今夜你会不会想起我

    夜渐渐的深了 疲惫了一天 还是觉得想写点什么 于是跳下床 把目光所及之处整理了一下 坐下来打开电脑 蓝光从电脑开关处不断的跳跃 随着windows熟悉的声音响起 输入密码 进入桌面 没有登录QQ 只是点开音乐播放器 单曲循环着一首老歌 一首
  • 强烈推荐

    一 前言 在开发中 我们经常会遇到这样一类需求 需要在网页上显示天气预报 股票数据或者实时排行榜单等实时变化的数据 对于此类需求 一种较为原始的做法就是让客户端每隔一段时间主动去轮询服务器 但这种做法有一个很大的弊端 如果客户端的数量很大
  • nginx中的脚本(理论篇)

    按照常规的打法或者按照常规的思路 针对变量的开发 也就是我们在ngx变量实现原理中介绍的那样 定义指令 设计结构体保存指令值 设计方法支持变量插入 利用自带的方法创建注册变量 利用自带的方法获取变量值等等 利用这些基本知识或功能点来开发变量
  • 密码设置十准则

    不论是互联网还是日常生活 我们都离不开密码设置 很多互联网用户都知道 即便是进行了密码设置 在很多时候我们也并不是那么安全 其实很多黑客之所以成功盗QQ 破解邮箱 往往就是因为我们的密码设置过于简单 如果自己设置的密码被别人猜到或破译 那么
  • vivado 亚稳态_【DNN Weaver FPGA实现】Vivado BRAM资源使用

    1 BRAM配置测试 我们知道Vivado中BRAM大小分为18K和36K两种 这两种BRAM在何种配置下会如何分配资源 需要进行一定的考量 由于Vivado可以配置生成任意bit数的IO位宽 所以我对BRAM配置进行了简单的实验 结果如下
  • AngularJS API

    1 AngularJS API概述 AngularJS 全局 API 用于执行常见任务的 JavaScript 函数集合 如 比较对象 迭代对象 转换对象 全局 API 函数使用 angular 对象进行访问 通用的 API 函数 API
  • 芝诺悖论

    我们先来看一下芝诺悖论的三个经典问题 阿基里斯是古希腊神话中的跑步健将 假设他和乌龟赛跑 他速度为乌龟的10倍 乌龟在前面10米出发 他在后面追 芝诺可以证明 阿基里斯永远不可能追上乌龟 当阿基里斯追到10米时 乌龟已经向前爬了1米 而当他
  • 业务场景——热点数据

    热点数据解决思路 识别热点 1 在代码层面做预热识别 比如给某个接口判断入参是否为热点数据的规则 比如redis过期时间1s 调一次 1但不更新过期时间 若增长量 gt 5则判为热数据 这种方法能更快速的识别热数据 但缺点是业务逻辑复杂 且
  • MySQL实现7天,15天,30天,90天用户留存数量查询

    如何计算用户留存率 新增用户留存率 新增用户中登录用户数 新增用户数 100 一般统计周期为天 新增用户数 在某个时间段 一般为第一整天 新登录应用的用户数 登录用户数 登录应用后至当前时间 至少登录过一次的用户数 第N日留存 指的是新增用