上次我们根据用户创建账号和登录日志进行了《用SQL进行用户留存率计算》,今天我们继续用这份用户登录日志来计算用户连续登录天数。 1....数据预览 这里我们用到的是用户登录的日志,其中用户每天可能存在多次登录。 用户登录日志 用户登录 以上案例数据 后台回复 955 可以在SQL文件夹里data领取 2....《『数据分析』pandas计算连续行为天数的几种思路》 《利用Python统计连续登录N天或以上用户》 今天,我们用SQL来进行本次的操作,大致分为以下几步: 数据去重 SELECT DISTINCT...(DATE_SUB),并按照用id和差值进行分组计数(这就是用户的连续登录天数) SELECT role_id , DATE_SUB(date,INTERVAL sort DAY) d_group ,...role_login ) temp_1 ) temp_2 GROUP BY role_id, DATE_SUB(date,INTERVAL sort DAY) 最后取每个用户id的连续登录天数的最大值即可
数据 求连续登陆的天数 CREATE TABLE `t_login` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255)
还是昨天的问题,统计每周内问题小区连续出现天数,MySQL可以实现吗?答案是肯定的,就是过程很曲折。 数据库查询语言基本都是针对整列的,不像excel是单元格粒度的,要判断行与行之间的差异比较麻烦。...首先获取当前日期与一个较早的日期的差值 计算表中大于等于当前日期的行数 两个值求和,求和相等则为连续出现,否则为间隔出现 SQL 呼之欲出 mysql> select -> bc.cellid,...| +--------+--------+------+------+ 13 rows in set (0.00 sec) 得到了 diff 和 rows ,将两者相加,然后按照该列分组计数就是持续天数...,再加上周数,就是每周持续天数 完整代码如下: mysql> select -> bc.cellid, -> bc.cgi, -> count(*) as `con_days`,...获取了每周连续出现天数,感觉怎么样?
需求 每个用户连续登录最大天数 建表语句 create table login( id string, rq string ) row format delimited fields terminated...by '\t' ; 数据 #这里将数据分开,便于直观看到连续登录天数 insert into table login values (1,"2019-07-26"), (1,"2019-07-27")...OK t3.id _c1 1 3 2 3 Time taken: 38.097 seconds, Fetched: 2 row(s) 分析 1、通过对需求理解发现,首先需要对用户id开窗 2、连续登录...,所以时间信息,并按照升序,需要在窗口里面添加order by 3、核心逻辑——连续登录的判断是,通过排序添加序号,再用当前日期和当前序号做差, 如果得到日期相同,则表示是连续日期,所以使用row_number...、最后得出每个用户差值日期数最多即需求 扩展 1、这里t1,t2可以合并为一步,减少一次子查询 2、第一次分组是每个用户每天只有一条数据,第二次分组是统计差值日期相同数量,第三次分组是统计每个用户最大连续登录天数
业务场景:用户运营需要找出"高活跃用户"(连续登录天数最长的用户),给他们推送 VIP 权益。同时也要找出"即将流失的用户"(连续登录天数突然下降)。...二、题目 现有一张用户登录日志表 t17_zj_user_login,记录了用户每天的登录情况(每天每用户至多一条记录)。请找出每个用户的最大连续登录天数。...05 | | 3 | 2025-01-03 | | 3 | 2025-01-04 | +----------+-------------+ 期望输出:每个用户的最大连续登录天数...),再套用差值法 当前连续天数:不只是历史最大,还要知道"截止今天正在连续的最近一段有多少天" 七、知识点总结 考点 说明 ROW_NUMBER + PARTITION BY 按用户分区编号 日期 -...ROW_NUMBER Gaps and Islands 差值法核心 相同差值 = 连续 连续日期的数学特性 DATE_SUB 日期减去整数天数 MAX + GROUP BY 取得每个用户的最长连续段
某音某团某节面试时,经常会问到连续登录问题,这个问题看似简单,属于那种“一看就会,一做就懵”的问题,网上分享的一些解题思路,逻辑上比较复杂,今天笔者来分享一种简洁而通用的解题思路,应付此类问题变得游刃有余...算法介绍 这里主要用到了一个算法:连续日期与固定日期的时间间隔递增,而在日期表中,大于等于当前日期的日期行数又是递减的,两者相加会得到一个固定值,如果相加之和出现变化,说明出现了不连续日期,详情可看下图...初识面试题 下面,咱们就应用这个算法来解一下这个面试题: 有用户表行为记录表t_act_records表,包含两个字段:uid(用户ID),imp_date(日期) 计算2021年每个月,每个用户连续登录的最多天数...计算2021年每个月,连续2天都有登录的用户名单 计算2021年每个月,连续5天都有登录的用户数 构造表mysql如下: DROP TABLE if EXISTS t_act_records; CREATE...,flag是连续日期的标志位,check_period 是核查的周期(可以是周week()、月month()、年year(),或者忽略此维度,核查所有的登录日期),continous_days 是核查周期内的连续登录日期天数
总第208篇/张俊红 今天来解一道题面试中可能经常会被一些面试官拿来“刁难”的题,就是《如何统计连续打卡天数》,当然了这里面的打卡可以换成任意其他行为,比如连续登陆天数,连续学习天数,连续购买天数,这里的天数也是可以换成小时或者别的时间单位的...到这里,如果我们要获取连续打卡天数是不是就很容易了。 不过这里面还有一个问题,就是连续打卡天数是截止目前最近的一个 连续打卡天数还是历史坚持最长的打卡天数,这就是传说中的口径问题哈。.../2/3 1 1 2020/2/4 1 1 2020/2/5 1 1 2020/2/6 0 1 2020/2/7 1 1 2020/2/8 1 上面这个例子中,最近连续打卡天数是2,历史最长的连续打卡天数却是...,我们只需要把上表中day_cha这一列最大的值对应的flag_days取出来就可以;要获取历史最久的连续打卡天数,我们只需要把上表中flag_days的最大值取出来就可以。...类似的需求可能还有获取过去连续打卡天数大于某个值得人,只需要筛选上表中的flag_days即可达到目的。
业务过程中,经常遇到需要计算连续天数的场景,比如:连续打卡天数、连续评优的同学、连续下单的客户等。 那么,计算连续天数是否有通用的模型呢?答案是肯定的。...filterT = FILTER('ratings',[level]="A") 分组 这里用到了计算连续天数的一个算法: 将 业务日期距离某固定日期的天数 与 业务表中大于当前业务日期的天数进行求和,...计算连续天数 上面已经计算了连续天数分组标记 group ,将分组标记进行 行计数,即可得到每个业务对象的连续分组天数 successiveDays = SUMMARIZE( 'groupT'..., 'groupT'[name], 'groupT'[group], "rowCNT", COUNTROWS('groupT') ) 计算最大连续天数 某些需求场景下,需要计算每个业务对象的最大连续天数...连续天数通用计算模型 连续天数通用计算模型可以抽象为: _successiveDays = VAR filterT = FILTER('ratings', [level] = "A") // 根据实际场景进行调整
一、题目 现有各用户的登录记录表t_login_events如下,表中每行数据表达的信息是一个用户何时登录了平台。...现要求统计各用户最长的连续登录天数,间断一天也算作连续,例如:一个用户在1,3,5,6登录,则视为连续6天登录。...| +----------+-------------+---------------+------------+-----------+ 4.按照用户和group_id 分组,计算每次连续登陆的天数...,再根据用户分组计算最大连续天数 首先根据user_id和group_id分组,用datediff计算出出最大登陆日期和最小登陆日期,两者做差+1 得到每次连续登陆的天数。...然后按照用户分组,使用max()计算每个用户最大连续天数。
有一张销售表,需要统计:1 按客户的最大连续进货天数;2 连续2天及以上进货的客户数。解决方案首先计算当前进货的最近一次未进货日期,然后用当前进货日期减去这个日期就得到连续进货天数了。...有了连续进货天数,按日期可以得出最大连续进货天数,然后再按客户可以得出按客户的最大连续进货天数,最后取按客户的最大连续进货天数大于等于2的客户数就很容易了。...连续进货天数 = DATEDIFF([最近未进货日期],MAX('销售表'[日期]),DAY)按日期最大连续进货天数:取所选日期范围内,连续进货天数的最大值。...按日期最大连续进货天数 = MAXX(VALUES('日期表'[Date]),[连续进货天数])按客户最大连续进货天数:取所选客户中,每个客户的最大连续进货天数的最大值。...按客户最大连续进货天数 = MAXX(VALUES('客户表'[客户]),[按日期最大连续进货天数])连续进货2天以上的客户数:取所选客户中,每个客户的最大连续进货天数>=2的客户数。
(daysBetweenNum / cycleNum) : (daysBetweenNum / cycleNum) + 1; System.out.println("两日期间相隔的天数为
最长连续活跃天数是衡量用户"上瘾程度"的核心指标——累计活跃天数可以被一次促销活动撑起来,但连续活跃天数反映的是用户是否养成了使用习惯。...业务场景:微信的"连续登录打卡"功能和QQ的"活跃天数勋章"体系背后就是连续活跃天数的计算。产品团队用这个指标找到"可能流失"的用户——昨天还在活跃、今天突然中断了的用户,需要Push拉回。...请计算每个用户的最长连续活跃天数。...,统计每组的天数,即为一个连续活跃段的天数 取每个用户的最大连续天数 维度 评分 题目难度 ⭐️⭐️⭐️⭐️ 题目清晰度 ⭐️⭐️⭐️⭐️⭐️ 业务常见度 ⭐️⭐️⭐️⭐️⭐️ 四、逐步推导 1....六、举一反三 当前连续天数:取 group_date 最大的一段(最近一段连续),而非所有段的最大值 连续N天以上筛选:HAVING 中加条件,找"连续7天活跃"的发勋章资格用户 最长连续不活跃天数:反过来计算
最近在处理数据的时候遇到一个需求,核心就是求取最大连续行为天数。类似需求在去年笔者刚接触pandas的时候也做过《利用Python统计连续登录N天或以上用户》,这里我们可以用同样的方法进行实现。...求连续污染持续天数 结合上次的《利用Python统计连续登录N天或以上用户》案例,我们这里再提供1种新的解题思路,合计2种解题思路。 以下解法来自小明哥和才哥 2.1....图7:辅助列值预览 我们可以发现,按照辅助列分组进行计数即可获得连续污染天数,如上红色标记区域。...图9:辅助列创建思路预览 我们也可以发现,按照辅助列分组计数即可获取空气质量连续天数(优良和污染均可),如上红色区域。...图10:思路2的解法2小明哥结果 以上就是本次全部内容,其实我们在日常工作生活中还可能遇到类似场景如:计算用户连续登录天数、计算用户连续付费天数、计算南方梅雨季节连续下雨天数等等!
然而,有时由于各种原因,我们可能偶尔会中断打卡,那么,我们要知道在打卡记录中,连续打卡(也就是坚持)的最长天数,应该怎么做呢?这就是今天我们想要用公式来解决的问题。 示例数据如下图1所示。...希望使用公式得到: 1.连续打卡的最长天数 2.最长坚持打卡是从哪里开始的 这里的关键是找出由TRUE变到FALSE或者由FALSE变到TRUE的位置。可以错位比较,找出单元格值变化的位置。...SMALL(IF(C6:C245C5:C244,B5:B244),B5:B244)-SMALL(IF(C4:C244C5:C245,B5:B245),B5:B245),0) 取其最大值,加上1,即为连续最长天数...Bug:本示例假设连续打卡的天数总是大于连续中断的天数,否则上述结果不正确。 下面是更酷的公式。...连续打卡最长天数: =MAX(FREQUENCY(IF(list,id),IF(list,,id))) 最长天数开始位置: =MATCH(F20,FREQUENCY(IF(list,id),IF(list
查看binlog过期时间,设置的时间为90天,这个值默认是0天,也就是说不自动清理,可以根据生产情况修改,本例修改为7天 mysql> show variables like 'expire_logs_days...-----------+-------+ | expire_logs_days | 90 | +------------------+-------+ 1 row in set (0.00 sec) mysql...将会new一个新文件用于记录binlog) 我们执行flush logs; mysql> flush logs; Query OK, 0 rows affected, 64 warnings (0.16...sec 如果binlog非常多,不要轻易设置改参数,有可能导致io争用,这时候可以使用purge命令予以清除: 将bin.000055之前的binlog清掉: mysql>purge binary logs...to 'bin.000055'; 将指定时间之前的binlog清掉: mysql>purge binary logs before '2017-05-01 13:09:51';
Hi, 我是小萝卜算子 一、简介 连续登录问题,是一个经典sql,本文从易到难,简单拓展,有更好方法的同学,欢迎私下交流 二、表结构(去过重的) CREATE TABLE `user_login`(...2:然后根据主表的id,和登录时间分组,分组后数量正好是3天的,说明连续三天时间都有登录 3:根据步骤二的结果去重,获取结果 方法二:巧用窗口函数row_number SELECT tmp2.id...flag = 1 GROUP BY tmp2.id 详解: 1:因为是固定的3天,所以可以采用lag(lead)方法,求出前面第二个的日期与当前的日期差 2:根据步骤一的结果,判断如果日期差等于2,则是连续登录...2:如果日期差为1,则连续登录,记为0,否则记录当前登录日期 3:利用窗口函数max,获取用户登录基准日期 4:根据基准日期分组,过滤出大于等于3天的数据 5:根据步骤四结果去重,获得最后结果 五、拓展...连续登录问题,其实可扩展为划分组别的问题 如果是时间不固定,比如求每个用户最大连续登录天数,那么方法一和三就失效了 如果仅仅是题目要求,求固定连续登录天数,那么个人更倾向于方法三 方法四的扩展性更强,
有两种方式可以获得mysql两个日期之间的差值,一种是使用TO_DAYS函数,另一种是datediff函数 select id, TO_DAYS(NOW()) - TO_DAYS(createTime
经常会在数据统计中取筛选连续性的数据,比如筛选连续三个月都登录的用户, 数据形式如下: 1 111 222 333 2 111 3 111 222 4 111 444 大体的意思就是1 2 3 4...代表月份1,2,3,4 111,222,333,444代表用户 1 111 222 333 代表一月份用户111 222 333登录了。...以此类推 如果要查找连续三个月登录的用户,我把数据结构进行了改进 1 111 1 222 1 333 2 111 3 111 3 222 4 111 4 444 这样就更符合关系型了。...3 111 4 444 4 --利用最大月份 减去 最小月份 +1 (不跨年的情况下),然后除去关联的月份数,如果是1,那就证明连续几个月就登录了...连续4个月的 SQL> select id2,max(id1),min(id1),count(*),max(id1)-min(id1)+1 from test group by id2 having
业务场景:游戏运营通过"连续购买天数"来设计订阅制道具——连续7天每天购买体力药水的玩家,可以推送"周卡"(一次买7天更便宜)。这道题的SQL就是识别这类消费习惯的基础查询。...请计算每个用户购买每种道具的最长连续购买天数,并输出该连续段的开始日期和结束日期。...; 按 (user_id, item_id, 基准日期) 分组,统计每段连续天数、开始日期、结束日期; 按 (user_id, item_id) 取最大连续天数; 维度 评分 题目难度 ⭐️⭐️⭐️⭐️...如果只写 PARTITION BY user_id,会把不同道具的购买日期混在一起,导致"跨道具的连续天数"被错误合并。...六、举一反三 连续购买金额递增:LAG获取上一次购买金额,加上 AND amount > LAG(amount) 条件,升级为"连续且递增购买" 购买周期分析:计算相邻两次购买的平均间隔天数,预测用户下次购买时间
一、题目 有用户登录日志表,包含日期、用户ID,当天是否登录,请查询出当天活跃的用户当前连续活跃天数; +-------------+----------+-----------+ | login_date...| | 2023-08-03 | 4 | 1 | +-------------+----------+-----------+ 二、分析 一眼看上去,连续登录问题...,然后balabla……(如果这样,就走弯路了,首先该题目中的原始数据经过清洗,其次需求只需要当前登录用户的最近联系登录的数据,而不是求历史所有的最大连续登录,千万别思维定式); 1.找到所有用户最后未登录日期...; 2.筛选出最后未登录日期的数据,(如果不存在未登录数据,则代表该用户一直连续登录) 3.对筛选结果进行分组统计; 维度 评分 题目难度 ⭐️⭐️⭐️ 题目清晰度 ⭐️⭐️⭐️⭐️⭐️ 业务常见度 ⭐️...用户3最后一天是未登录状态,所以结果记录中不存在用户3的登录记录。