加班问题的SQL(Teradata)解法

该博客讨论如何使用SQL(特别是Teradata)解决公司加班限制问题。在不使用游标或循环的情况下,通过递归查询减少每个员工每周加班小时数,确保不超过12小时的总和。给出了一种创建测试表和执行递归查询的解决方案。
摘要由CSDN通过智能技术生成

题目:
公司规定一周内加班总和最多只能12个小时,多余的要去掉,去掉的规则是:某天加班超过1H的才能去,而且是依次大致平均的去除,(最小单位是1小时)
举例:
日期 工号 加班小时
周一 A001  6
周二 A001  2
周三 A001  1
周四 A001  5
周五 A001  7
----------------
  共计加班:21H,超出9H

算法:
从周一开始依次删减,每天减1H(如果当天的加班时间>1H),一轮后如果还不够,再继续下一轮,直到刚好为12H为止(只对超过12H的而言)
最后的结果应该是:
日期 工号 加班小时
周一 A001  3  --减了3次
周二 A001  1  --减了1次
周三 A001  1  --减了0次
周四 A001  2  --减了3次
周五 A001  5  --减了2次
-----------------------
以上只列具体某一个人的,公司有好几千人,

实现要求:
用SQL语句实现,考虑到效率问题规定:
1.不能用游标
2.不能用循环
其它方法都可以

 

答案:

建立测试环境:
测试表:
CREATE SET TABLE TESTDB.testrecursive ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT
     (
      wkd CH

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值