使用SQL优雅的计算日期连续性问题

一、造数据

DROP TABLE IF EXISTS CSDN_TEST;
CREATE TABLE CSDN_TEST (
	user_id CHAR(4) COMMENT '用户id',
	access_year INT(4) COMMENT '访问年'
);

INSERT INTO CSDN_TEST VALUES 
('0001',1999),
('0002',1999),
('0001',2000),
('0002',2001),
('0001',2001),
('0002',2002),
('0001',2002),
('0002',2003),
('0001',2005),
('0001',2006),
('0001',2007);

二、查看数据结构

SELECT * FROM CSDN_TEST;

在这里插入图片描述

三、需求(计算出数据中每个用户的最长连续访问年数)

  • 1.使用开窗函数 row_number() 计算出每位用户访问记录中每一年在组内中的序号。

    SELECT
    	user_id,
    	access_year,
    	row_number() over(partition by user_id order by access_year) as rn
    FROM
    	CSDN_TEST;	
    

    在这里插入图片描述

  • 2.核心步骤:在上一次计算基础之上使用access_year 减去 rn

    SELECT 
    	user_id,
    	access_year,
    	row_number() over(partition by user_id order by access_year) as rn, 
    	access_year - row_number() over(partition by user_id order by access_year) as diff 
    FROM CSDN_TEST
    

    在这里插入图片描述
    到此,细心的朋友就已经返现图中的规律了。
    规律就是在一个用户的所有访问年当中,如果年是连续的那么它们的 diff 值是相同的

  • 3.求出每个用户的所有连续登录年数的情况

    SELECT *
    	user_id,
    	count(*) AS years
    FROM tmp
    GROUP BY user_id,diff
    

    在这里插入图片描述

注意:这里使用的 tmp 表就是前面一步计算出来的表,为了减少SQL 的复杂性,所以笔者简化了SQL,还请读者自行做一下改变

可以看出我们现在已经求出每个用户所有的连续访问年数,现在最后一步要做的就是利用上一步得出的数据,计算每个用户的最大访问年数 (还是以一样的我们把现在这一步骤得出的数据又命名为 tmp2 临时表)

  • 4.求出每个用户的最大连续访问年数

    SELECT 
    	user_id,
    	max(years) as max_years
    FROM tmp2
    GROUP BY user_id
    

    在这里插入图片描述

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值