首页 > 其他分享 >连续登录及其变种

连续登录及其变种

时间:2024-06-20 20:43:16浏览次数:23  
标签:01 uid 登录 变种 union 及其 dt id select

样例数据

点击查看代码
insert overwrite table test.ysj_lianxu_not 
  select 'a',        't1'
  union all
  select 'a',        't2'
  union all
  select 'a',        't3'
  union all 
  select 'b',         't3'
  union all
  select 'a',        't4'
  union all
  select 'a',        't5'
  union all
  select 'a',        't6'
  union all
  select 'a',        't7'
;

连续登录超过4天的用户

点击查看代码
SELECT diff,count(DISTINCT user_id ) d_ct
from (
SELECT user_id,click_time,date_sub(click_time,rk) as diff 
from (
SELECT user_id,click_time,row_number() over(PARTITION BY user_id ORDER BY click_time ) as rk 
from test.ysj_lianxu_not
) aa
) temp 
GROUP BY diff 
having count(DISTINCT user_id ) >=4
;

连续登录用户,且中间没有其他用户登录

  • 第一种方式
点击查看代码
select  user_id,diff,count(*)
from
(select user_id,rk_1-rk_2 diff
from
(select user_id
,row_number() over(order by click_time asc ) rk_1
,row_number() over(partition by user_id order by click_time asc ) rk_2
from test.ysj_lianxu_not
) b
) c
group by user_id,diff
having count(*)=4
;

第一种方式有以下的问题,应该用第二种方法

点击查看代码
--连续登陆天数的用户,并且中间没有其他用户登陆,此方法有问题,如果两个用户a和B,a用户和b用户在同一天的全局排序的顺序不同,则会造成误差
-- 	user_id	click_time	rk_1	rk_2
-- 	a	     t1	         1	     1
-- 	a	     t2	         2	     2
-- 	b	     t3	         3	     1
-- 	a	     t3	         4	     3 比如t3这一天,a排在b的后边,则会造成这一天数据和之后的日期连续,计算出来的a的连续登陆天数就会多一天
-- 	a	     t4	         5	     4
-- 	a	     t5	         6	     5
-- 	a	     t6	         7	     6
-- 	a	     t7	         8	     7
	

  • 第二种方式:
点击查看代码
WITH temp as (
SELECt click_time
from (
SELECT click_time,count(distinct user_id) as ct 
from test.ysj_lianxu_not
GROUP BY click_time
) aa
where ct = 1 
)
select  diff,user_id,count(*)
from (
select user_id,cast(replace(click_time,'t','') as int) - rk as diff 
from (
        SELECT  t2.user_id,t1.click_time,row_number() over(PARTITION BY t2.user_id ORDER BY t1.click_time ASC) as rk 
        from temp t1
        left join test.ysj_lianxu_not t2
        on t1.click_time = t2.click_time
        ) aa 
) bb 
GROUP BY diff,user_id
;

连续登录天数,允许间隔3天
间隔见天都可以,只需要将sql中的space函数的参数改成对应的天数减1就能满足

点击查看代码
with temp as (
select 111 as uid,'2023-01-01' as dt 
union all
select 111 as uid,'2023-01-03' as dt 
union all
select 111 as uid,'2023-01-05' as dt 
union all
select 111 as uid,'2023-01-06' as dt 
union all
select 111 as uid,'2023-01-09' as dt 
union all
select 111 as uid,'2023-01-10' as dt 
union all
select 111 as uid,'2023-01-11' as dt 
union all
select 111 as uid,'2023-01-13' as dt 
union all
select 111 as uid,'2023-01-17' as dt 
union all
select 111 as uid,'2023-01-19' as dt 
union all
select 111 as uid,'2023-01-20' as dt 
union all
select 222 as uid,'2023-01-01' as dt 
union all
select 222 as uid,'2023-01-02' as dt 
union all
select 222 as uid,'2023-01-05' as dt 
union all
select 222 as uid,'2023-01-07' as dt 
union all
select 222 as uid,'2023-01-08' as dt 
),
temp2 as (
        select *,date_add(tt.dt,sp.pos) as last_dt
        from temp  tt
        lateral view posexplode(split(space(2),'')) sp 
) ,
temp3 as (
        select uid,last_dt
        from temp2
        group by last_dt,uid
) 
select uid,diff,count(*) as ct 
from (
        select uid,date_sub(last_dt,rk) as diff
        from (
                select uid,last_dt,row_number() over(partition by uid order by last_dt ) as rk
                from temp3
        ) result 
) ed
group by uid,diff 

标签:01,uid,登录,变种,union,及其,dt,id,select
From: https://www.cnblogs.com/datadevelop/p/18259467

相关文章

  • windows server登录密码忘记,怎么重置
    在开始前,需要准备U盘,作为引导盘,进入安装界面亲测,对所有的windowsserver都有效步骤1在虚拟机的光盘中选择Server2012R2的ISO,并确定(如果是物理机,直接把ISO刻录成光盘,放入光驱即可)2重启服务器,修改启动项从CD-ROM启动,当在屏幕出现PressanykeytobootfromCDorDVD字样时,马上按......
  • linux修改shell导致无法登录
    linux修改shell导致无法登录我之前在切换shell的时候执行了chsh-sbashroot结果后面就无法登录系统了,当时不知道怎么一回事,只能先放到一边了。今天没什么事,突然福至心灵,为什么不试试进到单用户模式里面修改shell呢?然后我就得到了这样的提示:chsh:PAM:Authenticationfailure......
  • 理解 Java 中的 Future 及其底层实现
    目录什么是Future?Future的基本用法Future的局限性及改进Future的底层实现小结什么是Future?Future是Java中一个用于表示异步计算结果的接口。它主要用于处理那些可能需要较长时间运行的任务,使得主线程可以继续执行其他工作,而无需等待任务完成。Future的定义Fut......
  • Python Django 实现教师、学生双端登录管理系统
    文章目录PythonDjango实现教师、学生双端登录管理系统引言Django框架简介环境准备模型设计用户认证视图和模板URL路由前端设计测试和部署获取开源项目参考PythonDjango实现教师、学生双端登录管理系统引言在当今的教育环境中,数字化管理系统已成为必不可少的工......
  • 前端网站(一) - 登录页面及账号密码验证(完善版)【附源码】
    登录页面及账号密码验证开篇(请大家看完):此网站写给挚爱,后续页面还会慢慢更新,大家敬请期待~~~轻舟所编写这个前端框架的设计初衷,纯粹是为了哄对象开心。除此之外,并无其它任何用途或目的。此前端框架,主要侧重于前端页面的视觉效果和交互体验。通过运用各种前端技术和创意,......
  • 【4月27日RPA公开课UiPath圆满结束】掌握验证码自动登录技巧,实现高效自动化
    在数字化时代,自动化已成为提高工作效率、降低成本的必备工具。而RPA(RoboticProcessAutomation,机器人流程自动化)技术正是其中的佼佼者。为了帮助更多学员掌握RPA技术,RPA学习天地于4月27日举办了一场别开生面的公开课,主题为“如何实现各种验证码的自动登录”。   本次公开......
  • 前端:异地登录!!!
    哈喽,大家好!今天来聊一聊前端怎么实现异地登录提示!!!在数字化时代,账户安全是每个用户和开发者都不容忽视的问题。异地登录提示是一种安全措施,用于提醒用户他们的账户可能在不同的位置被访问。这通常涉及到检测登录行为的异常,比如IP地址的变化,并在检测到异常时通知用户。用户登......
  • 深入浅出简单工厂模式及其在 Spring 框架中的应用
    前言在软件开发过程中,我们经常需要创建各种对象。如果直接在客户端代码中使用new关键字来实例化对象,不仅会导致代码耦合度高,还会使系统难以扩展和维护。简单工厂模式通过引入一个工厂类来负责创建对象,降低了客户端与具体类之间的耦合度,提高了代码的灵活性和可维护性。在......
  • 【产品经理修炼之道】- 登录页怎么更好地吸引用户
    编辑导语:登录页对于一个网站来说十分重要,是用户对该网站的第一印象。本文作者分享了登录页更好地吸引用户的具体方法和思路,讲述了更好登录页文案的快捷方案和有效登录页文案的基本要素等,一起来学习一下吧。网站的开头都有个登录页。这往往是对公司的第一印象:是一个组织,它要......
  • MYSQL最左匹配原则及其底层逻辑
    目录前言一、最左匹配原则示例1.导入测试数据-索引(a,b,c)2.全值匹配查询3.连续匹配查询​编辑4.不连续匹配查询三、底层原理详解1.MYSQL优化器2.最左匹配原理前言最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会......