判断用户连续几天登录或者连续几天出单等

 

工作中清洗日志数据的时候有时候会有这样的场景,要看用户连续登陆的情况,或者商家连续有单,用户持续下单的数据,这时候可以写个UDF,如果嫌麻烦的可以参考以下sql,可以计算出用户连续登陆的天数,diff = 1就是连续登陆2天的,大于1就是连续登陆多天以上的。

--假定数据形式是:dt(登录日期-yyyymmdd类型)  uid(用户id)   
select	uid
from	(
		    SELECT  uid
                    ,num
				    ,MAX(dt) - MIN(dt) diff
		    FROM    (
				        SELECT  a.uid
						        ,a.dt
						        ,dt - rn as num 
				        FROM    (
						            SELECT  uid
								            ,dt
								            ,row_number () over (PARTITION BY uid ORDER BY dt) rn 
						            FROM     table_name
						            GROUP BY uid
								             ,dt
						        ) a1
				    ) a2 
		    GROUP BY uid
                    ,num
		) t3
where	diff = 1
group by uid
;

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我来为您解答。 实现连续登录七天功能,可以通过记录用户登录的时间,并对登录时间进行判断来实现。具体实现步骤如下: 1. 定义一个表示用户登录时间的类,包含登录时间和登录状态等信息。 ``` public class LoginInfo { private Date loginTime; // 最近一次登录时间 private int consecutiveDays; // 连续登录天数 private boolean loginStatus; // 当天登录状态 true:已登录 false:未登录 // 构造函数 public LoginInfo(Date loginTime, int consecutiveDays, boolean loginStatus) { this.loginTime = loginTime; this.consecutiveDays = consecutiveDays; this.loginStatus = loginStatus; } // 省略getter和setter方法 } ``` 2. 在用户登录时,判断用户是否登录过。 ``` public LoginInfo login(Date now, LoginInfo loginInfo) { if (loginInfo.getLoginTime() == null) { // 用户第一次登录 loginInfo.setConsecutiveDays(1); loginInfo.setLoginStatus(true); } else { long diff = now.getTime() - loginInfo.getLoginTime().getTime(); if (diff < 24 * 60 * 60 * 1000) { // 用户当天已登录 loginInfo.setLoginStatus(true); } else if (diff < 7 * 24 * 60 * 60 * 1000) { // 用户连续登录 loginInfo.setConsecutiveDays(loginInfo.isLoginStatus() ? loginInfo.getConsecutiveDays() : loginInfo.getConsecutiveDays() + 1); loginInfo.setLoginStatus(true); } else { // 用户登录超过七天 loginInfo.setConsecutiveDays(1); loginInfo.setLoginStatus(true); } } loginInfo.setLoginTime(now); return loginInfo; } ``` 其中,now表示当前时间,loginInfo表示用户上一次登录的信息。如果用户第一次登录,则将连续登录天数设置为1,登录状态设置为true;否则,根据当前时间和上一次登录时间的差值进行判断,如果小于24小时,则表示用户当天已登录,仅更新登录状态;如果小于七天,则表示用户连续登录,更新连续登录天数和登录状态;否则,表示用户登录超过七天,将连续登录天数设置为1,登录状态设置为true。 3. 返回当前登录天数和当天是第几天。 ``` public Map<String, Object> getLoginInfo(LoginInfo loginInfo) { Map<String, Object> result = new HashMap<>(); result.put("consecutiveDays", loginInfo.getConsecutiveDays()); result.put("today", loginInfo.isLoginStatus() ? loginInfo.getConsecutiveDays() : loginInfo.getConsecutiveDays() + 1); return result; } ``` 其中,loginInfo表示用户最近一次登录的信息。返回一个Map类型的数据,包含两个参数:consecutiveDays表示当前连续登录天数,today表示当天是第几天。如果当天已登录,直接返回连续登录天数;否则,返回连续登录天数+1。 希望以上解答能够帮到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值