SQL_连续登陆问题

方案1:使用ROW_NUMBER函数

  • 1、先对数据user_id分组,根据用户的活动日期排序
  • 2、用登录日期与rn求date_sub,得到的差值日期如果是相等的,则说明这两天肯定是连续的
    • 举例说,2023年1月1号、1月2号、1月3号;排名分别是1,2,3;现在用日期 - 排名 是不是都等于2022年12月31号
  • 3、根据user_id和日期差sub_date分组,登录次数即为分组后的count(1)

1、针对对数据user_id分组,根据用户的活动日期排序

select
	user_id,
	activity_date,
	ROW_NUMBER() over(partition by user_id order by activity_date) as rn
from user_activity

在这里插入图片描述

2、用登录日期与rn求date_sub,得到的差值日期如果是相等的,则说明这两天肯定是连续的

SELECT
	user_id,
	activity_date,
	DATE_SUB(activity_date,INTERVAL rn DAY) as sub_date
from(
	select
		user_id,
		activity_date,
		ROW_NUMBER() over(partition by user_id order by activity_date) as rn
	from user_activity
)t1

在这里插入图片描述

3、根据user_id和日期差sub_date分组,登录次数即为分组后的count(1)

SELECT
	user_id,
	min(activity_date) as min_date,
	max(activity_date)  as max_date,
	count(1) as  login_times
from(
	SELECT
		user_id,
		activity_date,
		DATE_SUB(activity_date,INTERVAL rn DAY) as sub_date
	from(
		select
			user_id,
			activity_date,
			ROW_NUMBER() over(partition by user_id order by activity_date) as rn
		from user_activity
	)t1
)t2
group by user_id,sub_date
having login_times>=3;

在这里插入图片描述
从结果可以看出用户5,6,7,8存在连续登录3天及其以上的用户

方案2:使用lag和lead函数

  • 1、针对每个user_id,先使用lead函数将当前日期后后一天日期求出来
  • 2、针对每个用户,进行后一天的日期与当期日期相差值=1则属于连续登录。
    举例说,2023年1月1号、1月2号、1月3号;现在用日期2号 - 前后与它相差值2-1=1;3-2=1.是不是值都否为1呢。
  • 3、针对用户分组,datediff函数求出最大活动时间和最小活动时间的天数,求出>=3天的用户
WITH LoginDates AS (
    SELECT 
        user_id, 
        activity_date,
        LEAD(activity_date) OVER (PARTITION BY user_id ORDER BY activity_date) AS next_login_date
    FROM 
        user_activity
)
SELECT 
    user_id
FROM 
    LoginDates
WHERE 
    DATEDIFF(activity_date, next_login_date) = 1
GROUP BY 
    user_id
HAVING 
    COUNT(*) >= 3;
好的!以下是一道关于“连续登录”的 Hive SQL 问题: --- ### 问题描述: 假设我们有一张用户登录日志表 `user_login`,结构如下: | 字段名 | 类型 | 描述 | |--------------|-------------|----------------| | user_id | STRING | 用户ID | | login_date | DATE | 登录日期 | 数据示例如下: | user_id | login_date | |---------|-------------| | A | 2023-10-01 | | B | 2023-10-01 | | A | 2023-10-02 | | B | 2023-10-04 | | A | 2023-10-05 | | C | 2023-10-06 | **任务:** 编写一条 HiveSQL 查询语句,找出每个用户的最长连续登录天数。 #### 提示: 可以利用窗口函数 `ROW_NUMBER()` 和日期差值计算等技巧完成此题。通过构造辅助列并分组统计来判断连续登录情况。 --- ### 示例解决方案(思路): 以下是解决该问题的一种可能的 SQL 思路: ```sql WITH ranked_logins AS ( SELECT user_id, login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn FROM user_login ), grouped_logins AS ( SELECT user_id, login_date, ADD_DAYS(login_date, -rn) AS grp_key FROM ranked_logins ) SELECT user_id, MAX(consecutive_days) AS max_consecutive_days FROM ( SELECT user_id, COUNT(*) AS consecutive_days FROM grouped_logins GROUP BY user_id, grp_key ) t GROUP BY user_id; ``` 上述查询分为三步: 1. **添加行号 (`ROW_NUMBER`):** 按照 `login_date` 排序生成行号; 2. **构建分组键 (`grp_key`):** 利用日期减去对应的行号得到一个虚拟分组标识符; 3. **按分组计数:** 对每一段连续区间进行计数,并最终选出最大值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值