SQL中如何统计员工最大连续打卡天数

7 篇文章 0 订阅

针对员工最大连续打卡天数等类似问题SQL求解,完整SQL代码见文尾。思路如下,

示例数据如下,

iddatesuccess
12020/4/21
12020/4/31
12020/4/41
12020/4/50
12020/4/61
12020/4/71
22020/4/21
22020/4/31

1)通过窗口函数对员工打卡数据进行排序

iddatern
12020/4/21
12020/4/32
12020/4/43
12020/4/64
12020/4/75
22020/4/21
22020/4/32

2)计算当前打卡日期与序号差值,我们可以看到如果是连续打卡,则label_date值是相同的

iddaternlabel_date
12020/4/212020/4/1
12020/4/322020/4/1
12020/4/432020/4/1
12020/4/642020/4/2
12020/4/752020/4/2
22020/4/212020/4/1
22020/4/322020/4/1

 

3)对label_date进行计数,取计数结果count_day的最大值即为最大连续打卡天数

idlabel_datecount_day
12020/4/1
12020/4/2
22020/4/1

SQL代码如下,

select
	c.id,max(count_day) as max_day
from
(
	select
		b.id,b.label_date,count(*) as count_day
	from
	(
		select
			a.id,a.date,date_sub(a.date, cast(rn as int)) as label_date
		from
		(
			select 
				id,date, 
				row_number() over(partition by id order by date) as rn
			from events where success=1
		)a
	)b
	group by b.id,b.label_date
)c
group by c.id;
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值