首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用SQL计算用户连续登录天数

上次我们根据用户创建账号和登录日志进行了《用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的连续登录天数的最大值即可

2.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL高阶-统计每周连续出现天数

    还是昨天的问题,统计每周内问题小区连续出现天数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`,...获取了每周连续出现天数,感觉怎么样?

    1.9K20

    hive sql(六)—— 每个用户连续登录最大天数

    需求 每个用户连续登录最大天数 建表语句 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、第一次分组是每个用户每天只有一条数据,第二次分组是统计差值日期相同数量,第三次分组是统计每个用户最大连续登录天数

    2.9K40

    MySQL 连续登录通用计算模型

    某音某团某节面试时,经常会问到连续登录问题,这个问题看似简单,属于那种“一看就会,一做就懵”的问题,网上分享的一些解题思路,逻辑上比较复杂,今天笔者来分享一种简洁而通用的解题思路,应付此类问题变得游刃有余...算法介绍 这里主要用到了一个算法:连续日期与固定日期的时间间隔递增,而在日期表中,大于等于当前日期的日期行数又是递减的,两者相加会得到一个固定值,如果相加之和出现变化,说明出现了不连续日期,详情可看下图...初识面试题 下面,咱们就应用这个算法来解一下这个面试题: 有用户表行为记录表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 是核查周期内的连续登录日期天数

    79730

    Sql如何统计连续打卡天数

    总第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即可达到目的。

    3.1K10

    Excel巧算连续打卡最长的天数

    然而,有时由于各种原因,我们可能偶尔会中断打卡,那么,我们要知道在打卡记录中,连续打卡(也就是坚持)的最长天数,应该怎么做呢?这就是今天我们想要用公式来解决的问题。 示例数据如下图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

    1.1K20

    『数据分析』pandas计算连续行为天数的几种思路

    最近在处理数据的时候遇到一个需求,核心就是求取最大连续行为天数。类似需求在去年笔者刚接触pandas的时候也做过《利用Python统计连续登录N天或以上用户》,这里我们可以用同样的方法进行实现。...求连续污染持续天数 结合上次的《利用Python统计连续登录N天或以上用户》案例,我们这里再提供1种新的解题思路,合计2种解题思路。 以下解法来自小明哥和才哥 2.1....图7:辅助列值预览 我们可以发现,按照辅助列分组进行计数即可获得连续污染天数,如上红色标记区域。...图9:辅助列创建思路预览 我们也可以发现,按照辅助列分组计数即可获取空气质量连续天数(优良和污染均可),如上红色区域。...图10:思路2的解法2小明哥结果 以上就是本次全部内容,其实我们在日常工作生活中还可能遇到类似场景如:计算用户连续登录天数、计算用户连续付费天数、计算南方梅雨季节连续下雨天数等等!

    7.4K11

    数仓面试——连续登录问题

    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:根据步骤四结果去重,获得最后结果 五、拓展...连续登录问题,其实可扩展为划分组别的问题 如果是时间不固定,比如求每个用户最大连续登录天数,那么方法一和三就失效了 如果仅仅是题目要求,求固定连续登录天数,那么个人更倾向于方法三 方法四的扩展性更强,

    1.1K30

    关于连续登录的问题探究

    经常会在数据统计中取筛选连续性的数据,比如筛选连续三个月都登录的用户, 数据形式如下: 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

    836120

    HiveSQL-面试题027 当天活跃用户当前连续活跃天数

    一、题目 有用户登录日志表,包含日期、用户ID,当天是否登录,请查询出当天活跃的用户当前连续活跃天数; +-------------+----------+-----------+ | login_date...| | 2023-08-03 | 4 | 1 | +-------------+----------+-----------+ 二、分析 一眼看上去,连续登录问题...,然后balabla……(如果这样,就走弯路了,首先该题目中的原始数据经过清洗,其次需求只需要当前登录用户的最近联系登录的数据,而不是求历史所有的最大连续登录,千万别思维定式); 1.找到所有用户最后未登录日期...; 2.筛选出最后未登录日期的数据,(如果不存在未登录数据,则代表该用户一直连续登录) 3.对筛选结果进行分组统计; 维度 评分 题目难度 ⭐️⭐️⭐️ 题目清晰度 ⭐️⭐️⭐️⭐️⭐️ 业务常见度 ⭐️...用户3最后一天是未登录状态,所以结果记录中不存在用户3的登录记录。

    19210

    MySQL查询连续数据

    查询连续记录并对这些连续数据统计取出指定连续次数的记录,这类操作并不多,但出现时会比较棘手。...查询思想是: 顺序行号 - 减首差值 = 连续差块 顺序行号 如同 Oracle 中的 rownum 但MySQL目前还没有这个功能,所以只能通过局部变量来实现, 减首差值 就是每条记录与最开始记录的差...(需要保证这个差值与顺序行号递增值相同,当然如果本来就是自增值则不需要单独计算) 只要 顺序行号与减首差值保持相同递增值则 连续差块 值相同,就可以统计出连续长度 示例表:(以简单的签到表为例) create...查询的思路是: 1.提取出全表用户每次打卡记录与第一次打卡记录的差值但按用户与日期正排序 2.增加一个局部变量rownum与上面查询数据进行连查 3.在结果字段集里使用日期差值减去自增顺序行号值得到连续差块...4.通过分组用户与连续差块获取连续签到次数 5.通过having来提取超过6次签到的用户

    4.6K20

    MySQL查询连续打卡信息?

    导读 最近多次看到用SQL查询连续打卡信息问题,自己也实践一波。抛开问题本身,也是对MySQL窗口函数和自定义变量用法的一种练习。...02 单用户打卡查询 单用户情况下,求解连续打卡信息意味着,在对日期顺序排序的基础上: 如果用户今天打卡: 如果昨天也打卡,则今天连续打卡天数是在昨天基础上+1 如果昨天未打卡,则连续打卡天数从1开始,...多用户连续打卡信息 在获得各用户连续打卡天数信息后,如果是查询各用户最近连续打卡天数,则可依据用户进行分组后查询该用户最近连续打卡天数大于0的信息(为表述简单,记前面查询到的衍生表为tmp表): 1SELECT...多用户历史最长连续打卡信息 其中,注意到用户2有两次历史连续打卡天数为4的记录,且都是该用户最长打卡记录。...05 总结 本文对MySQL中查询用户连续打卡这一问题进行了分析,主要是基于自定义变量的方式,实现了以下问题: 查询各用户每天的连续打卡信息(包括未打卡时记为0) 查询各用户最近连续打卡信息 查询各用户历史最长打卡信息

    4.1K10

    hive 计算连续7天登录的用户

    整体实现思路: 1.用户每天可能不止登陆一次,将登录日期去重,取出当日登陆成功的日期,row_number()函数分组排序并计数 2.日期减去计数得到值 3.根据每个用户count(值)判断连续登陆天数...4.最后取连续登陆天数大于等于7天的用户 示例: CREATE TABLE db_test.user_log_test( datestr string comment ‘日期’, uid string...datestr asc) as rn from db_test.user_log_test where status=1 ) a where rn=1 ) b 3.根据每个用户count(值)判断连续登陆天数...select uid,count(*) cnt–连续登陆天数 from ( select uid,date_sub(datestr,num) date_rn from ( select...rn from db_test.user_log_test where status=1 ) a where rn=1 ) b)c group by uid,date_rn 4.最后取连续登陆天数大于等于

    1.5K10

    数仓面试——连续登录问题进阶版

    Hi, 我是小萝卜算子 一、引入 紧接上一篇文章:数仓面试——连续登录问题 表结构和数据一致 需求有所升级: 中间间隔一天,也算连续登录,求出连续4天登录的用户id(因为样例中1001用户连续3天登录,...但是升级后,则可视为连续4天登录) 二、思考 由于间隔一天也算连续登录 数仓面试——连续登录问题中方法一/二/三的方式将不再有效,因为过滤条件变成不固定的筛选日期了 方法四依然有效,只需要将flag...,比较当前日期与上一个登录日期的差 2:如果日期差小于等于2,则连续登录,记为0,否则记录当前登录日期 3:利用窗口函数max,获取用户登录基准日期(连续登录为0,所以max为前标线) 4:根据基准日期分组...,为连续登录天数(最后一行特殊处理) 6:根据用户去重,获得结果 方法四:采用sum分组 SELECT id FROM ( SELECT id, base...0,不是则为当前登录日期,然后利用max窗口函数,按登录时间升序,获得分组的日期基准 方法三设定连续登录基准线,连续登录为0,不是则为1,然后添加一个自增序列,那么就可以把1的和最后一条提取出来,然后计算前后的序列差

    1.1K40
    领券