mysql计算用户次日/周/月留存的常用窗口函数-LEAD

作者:admin 发布时间:2024-01-11 16:28:59 浏览:158次

在日常的分析任务中,我们一般需要利用mysql语法直接计算用户的次日留存率,那么该怎么实现呢?不说废话,直接上思路和案例。

比如 一个餐饮公司需要计算用户每日的次日复购情况,该怎么实现呢?(注意:该餐饮公司周末两天不送餐)

实现思路

1、获取用户基本信息:用户id、用户名称、用餐日期

2、使用if判断, 使用DAYOFWEEK函数判断是否是星期五,如果是星期五则使用DATE_ADD加2天,否则取原来的日期

3、使用LEAD窗口函数获取该用户下一个用餐日期

4、通过嵌套,利用GROUP BY分组,最后判断两个日期相减是否等于1,如果等于1则计算为复购

演示代码

SELECT
delivery_date,
COUNT(DISTINCT user_id) as 当日订餐用户数
,count( if(第几天复购=1,user_id,null)
) as 次日用餐人数
from 
(SELECT
	user_id,
	user_name,
	activity_type_name,
	delivery_date,
	WEEK ( delivery_date, 7 ) AS 周,
	MONTH ( delivery_date ) AS 月,if(DAYOFWEEK(delivery_date)=6,DATE_ADD(delivery_date,INTERVAL 2 day),delivery_date) as 实际日期,
	LEAD(delivery_date,1) over(PARTITION by user_id ORDER BY delivery_date ) as 下一个日期,
	DATEDIFF(LEAD(delivery_date,1) over(PARTITION by user_id ORDER BY delivery_date ),if(DAYOFWEEK(delivery_date)=6,DATE_ADD(delivery_date,INTERVAL 2 day),delivery_date)) as 第几天复购

-- 	lag(WEEK ( delivery_date, 7 ),1) over(PARTITION by user_id ORDER BY delivery_date ) as 上一个周期
FROM
	dw_user_orders 
WHERE
	from_type = '订餐' 
	AND status_name = '送餐'  
	and delivery_date BETWEEN '2023-11-10' and '2024-1-11' 
	)s
	GROUP BY delivery_date

扩展学习

在MySQL中,可以使用DAYOFWEEK()函数来判断当前日期是星期几。


SELECT DAYOFWEEK(NOW());

这将返回一个数字,代表当前日期是星期几: 1 表示星期日 2 表示星期一 3 表示星期二 4 表示星期三 5 表示星期四 6 表示星期五 7 表示星期六


LEAD函数用于访问当前行的下一行的column1的值。通过指定ORDER BY子句,你可以指定结果集的排序顺序。如果没有指定排序顺序,默认情况下按照查询返回的顺序进行排序。 除了LEAD函数之外,你还可以使用LAG函数来访问上一行的数据,使用FIRST_VALUE函数来访问窗口中第一行的数据,以及使用LAST_VALUE函数来访问窗口中最后一行的数据。 以下是对应的示例:


SELECT column1, 
LEAD(column1) OVER (ORDER BY column1) AS next_value

LAG(column1) OVER (ORDER BY column1) AS previous_value, column2,
FIRST_VALUE(column2) OVER (ORDER BY column1) AS first_value,
LAST_VALUE(column2) OVER (ORDER BY column1) AS last_value 
FROM your_table;


mysql中日期的加减 date_add()、date_sub() 函数


DATE_ADD() :从日期增加指定的时间间隔,返回的是一个字符串


DATE_ADD(date,INTERVAL expr type)


date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。


DATEDIFF函数用于返回两个日期的天数

语法:dateaiff(date1,date2)

参数说明


date1: 比较日期1


date2: 比较日期2


DATEDIFF函数返回date1 - date2的计算结果,date1和date2两个参数需是有效的日期或日期时间值;如果参数传递的是日期时间值,DATEDIFF函数仅将日期部分用于计算,并忽略时间部分(只有值的日期部分参与计算)




如需转载请保留本文出处: https://zhe94.com/953.html

上一篇:mysql 复制表和表数据的方法
下一篇:SQL的执行顺序是什么
MySQL-窗口函数有哪些

MySQL-窗口函数有哪些

定义 窗口可以理解为记录集合,窗口函数就是在满足某种条件的记录集合上执行的特殊函数。 即:应用在窗口内的函数。
MySQL查询连续n天登录的用户的方法

MySQL查询连续n天登录的用户的方法

这篇文章介绍了SQL查询至少连续n天登录用户的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
MySql中group_concat字符长度限制1024怎么办

MySql中group_concat字符长度限制1024怎么办

group_concat长度限制默认是1024,如果在实际使用过程中拼接好的字符串长度超过了最大长度,那么最后仅保留前1024个字符,解决group_concat长度限制有两个解决方法
mysql 怎么重启,Windows系统mysql8.0重启的方法详解

mysql 怎么重启,Windows系统mysql8.0重启的方法详解

Windows要重新启动 MySQL,你可以按照以下步骤进行操作,命令提示符界面中,输入以下命令来关闭 MySQL 服务
MySQL8.0的WITH查询实现递归遍历省市区

MySQL8.0的WITH查询实现递归遍历省市区

WITH 子句是 MySQL 中的一种 SQL 结构,又称为 Common Table Expression (CTE)。它在不影响原有 SQL 语句的情况下,允许开发人员临时创建一个内存中的结果集,然后对其进行操作。