数据库-5 求员工连续工作天数

这篇博客介绍了如何在Oracle数据库中利用lag分析函数计算员工连续工作天数。首先需要将打卡数据转化为0和1,然后通过lag函数获取连续工作天数。文章提到了数据预处理、时间转换以及处理数据缺失问题的重要性,其中对于缺失打卡记录的处理采用了笛卡尔积的方法,最后通过union all和group by进行数据整合和计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前遇到的一个需求,求公司员工连续工作天数。

大概的数据格式:

员工工号     日期      当天打卡时长

12345    20171201         8

12345    20171202         9

Oracle中有一个比较方便的分析函数可用 : lag  over 。

使用此函数需要对数据进行预处理。将打卡时长处理成 0和1,有上班记为1,未上班记为0。

取两个0之间的差值减1即为连续工作天数。

关键语句大概如下:

      work_date- lag(work_date,1) over ( partition by  EMPLOYEE_NO order by work_date) -1  

具体lag用法可百度。

注:需要做时间转换,字符串转时间。
     

    计算额外发现一个问题,源数据缺失导致计算错误,如下数据缺失20171127数据,计算时直接计算1128-1125 -1,与实际不符。

   12345   20171125     0

   12345   20171126     8

   12345   20171128    0


  这个算是数据源的问题,但是计算逻辑也存在问题,无打卡记录不能计算为连续工作,但采用如上方法会将无打卡记录的日期算为工作日期。

  用了一种羞于启齿的方法。

  笛卡尔积 (cross join)。

  在计算过程中额外union all 所有员工近一个月无打卡记录的数据(示例如下),

12345  20171126    0       

12345  20171127    0

将缺失打卡记录算作未上班。

 拼接之后需要做处理

     select   工号,日期 ,sum(打卡)    from ( 源数据 union all  cross join数据)  group by   工号,日期 ;

处理后的数据就可以用lag来计算了(数据量不太大,10s以内处理完成)。


lag方法思路源自 SQL Cookbook。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值