sql统计连续签到或连续矿工

数据表如下

......
2021-12-01        2
2021-12-021
2021-12-030
2021-12-040
2021-12-050
2021-12-061
......

首先计算并标记出是否打卡

select a.day,a.num,
CASE when ISNULL(b.num, 0)=0 then 0 else 1 end as clocked,
CASE when ISNULL(b.num, 0)=0 then 1 else 0 end as unclocked
from a 
userdaynum       clockedunclocked
......
12021-12-01        210
12021-12-02110
12021-12-03001
12021-12-04001
12021-12-05001
12021-12-06110
2......

希望得到结果:最长连续打卡记录或者最长连续未打卡记录,计算方法一样

userclocked_daysunclocked_days
123
2......

在此处可以用是否打卡的标识位与一个递增的数字依次做减法的差,如果差值相等说明是连续打卡。

所以第一步先补上一列递增数字,此处使用row_number()窗口函数

select user,day,
row_number () OVER (partition BY user ORDER BY day) date_rank
from a where clocked=1

然后计算打卡日期day与递增数date_rank之间的差

SELECT
		user,
		day,
		date_rank,
		( DATEDIFF(day,'2020-12-31',day) - date_rank ) AS day_cha 
	FROM
		( SELECT user, day, row_number () OVER (partition BY userORDER BY day) date_rank FROM REPORT_CLOCK WHERE unclocked = 1) t1 

得出结果,连续打卡日期的day_char都是相等的。

user        daydate_rankday_cha
12021-12-01        10
12021-12-0220
12021-12-0631
2...

然后根据user跟day_char  group by之后获取count之后的结果

SELECT
	user,
	day_cha,
	COUNT ( day) flag_days 
FROM
	(
	SELECT
		user,
		day,
		date_rank,
		( DATEDIFF(day,'2020-12-31',day) - date_rank ) AS day_cha 
	FROM
		( SELECT user, day, row_number () OVER (partition BY userORDER BY day) date_rank FROM REPORT_CLOCK WHERE clocked = 1) t1 
	) t2 
GROUP BY
	user,
	day_cha
user       day_chaflag_days
102
111
2......

此时,flag_days的最大值即为最长连续打卡时间,day_cha最大值对应的flag_days即为最近连续打卡日期

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值