连续登录签到的问题解决方案

连续登录签到的问题解决方案
需求:统计每个月每个员工上班签到连续天数,如果请假或者漏打卡则归零重新计算,这类的问题可以通过一个窗口函数row_number解决这个问题。

这个SQL可以解决计算用户连续登陆、签到、上班、旷工等一系列问题

0.测试数据库:PostgreSQL
1.定义一个简单的表结构 user_id:用户名,datetime:签到日期
2.第一步我们用row_number()over(partition by user_id order by datetime)按照人和日期进行分组排序
3.将表中第二列日期比如2018-07-01截取,将01截取出来转换成数字
4.把这个截取的数字减去row_number()over()计算出来值
5.将user_id 和 上一步计算的值作为分组号,如果是日期不连续,那么同一个月内上一步计算的值是不一样的,所以分组号也是不一致的,依据的就是这个原理。
6.对分组号进行group by,就可以算出每段连续上班的开始、结束时间、天数
7.根据需求,筛选符合你需求的条件就可以了。

下面是完整的sql:

select user_id,max(cnt) from (
select user_id,rn_1,min(datetime),max(datetime),count(*)as cnt from
(select user_id,datetime,rn,cast(substr(cast(datetime as varchar),9,2)as int)-rn as rn_1 from
(select user_id,datetime,
row_number()over(partition by id order by time)as rn from test
)a1
)a2 group by user_id,rn_1
)a3 group by user_id
;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值