求用户连续登陆的最大天数

导读:本篇文章讲解 求用户连续登陆的最大天数,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目:

这张表记录了用户id为1001和1002的登陆日期,
求:用户各自连续登陆的天数最大值?
在这里插入图片描述

思路:

  1. 类似求连续3天访问的用户id
    需要增加以 user_id开窗,计算时间的排名(如果时间有重复用DENSE_RANK),将结果作为新的字段 rank
  2. 用访问日期减去排名rank,得到一个时间tmp ,如果用户是连续访问的,那么这个时间差 tmp就是一样的!
  3. 对 tmp 进行 count 记数
  4. 找到最大的 count 即为答案。

(1)先按照用户id(usr_id)对访问日期(log_date)进行排名

SELECT user_id, log_date, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY log_date) AS rank 
FROM user_logging_format;

在这里插入图片描述

(2) 得到排名后,用log_date 减去 rank序号!得到差值 tmp
tmp相同则代表是连续的!;

SELECT user_id, 
	log_date, 
	DATE_SUB(log_date,cast(rn AS INT) AS tmp
FROM(
	SELECT user_id, log_date, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY log_date) AS rank FROM user_logging_format)as q1;

(3)根据user_id 和 tmp 联合分组并统计tmp,tmp相同的被统计,即得到连续的天数

SELECT 
	user_id, 
	tmp, 
	count(*) AS count 
FROM
	(SELECT user_id, 
	log_date, 
	DATE_SUB(log_date,cast(rn AS INT)) AS tmp 
	FROM(SELECT user_id, log_date, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY log_date) AS rank FROM     					user_logging_format)q1)q2 GROUP BY user_id, tmp;

(4) 最后求出每个user_id 连续登录的最大天数,即对相同tmp记数后的最大值;

SELECT user_id,MAX(cc) 
FROM
	(SELECT 
		user_id, 
		tmp, 
		count(*) AS cc
	FROM
		(SELECT user_id, 
		log_date, 
		DATE_SUB(log_date,cast(rn AS INT)) AS tmp 
		FROM(SELECT user_id, log_date, ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY log_date) AS rank FROM user_logging_format)a1)q2 GROUP BY user_id, tmp)q3
	GROUP BY user_id;

注意:如果原始数据有重复,则使用DENSE_RANK而不是 ROW_NUMBER;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89158.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!