zyzx1214 2020-07-01 14:25 采纳率: 100%
浏览 119
已采纳

请问各位大神使用SQL能否检索岗位超期未轮换?

数据源:

操作日期 系统号 操作员A岗 操作员B岗
.............................
20200519 K 张三 李四
20200528 K 王五 张三
20200529 K 张三 李四
20200604 K 张三 王五
20200608 K 张三 李四
20200612 K 李四 张三
20200621 K 张三 李四
20200622 K 王五 张三
.............................

1.操作日期是没有规律的,可能一天用好几次,也可能一次不用。
2.操作员A岗和B岗人员是不固定的,可以是任何一个人。
3.任何一个操作员不能连续操作系统超过30天。
4.数据源中张三就超期了,(5月19日-6月22日)。如果把5月28日张三改成李四,则所有人没有超期。

  • 写回答

5条回答 默认 最新

  • qq_28838019 2020-07-01 17:13
    关注

    select *
    from (select t.操作员A岗,
    t.连续操作开始日期,
    t.连续操作结束日期,
    连续操作结束日期 - 连续操作开始日期+1 as 连续工作时长,
    rank() over(partition by 操作员A岗 order by 连续操作结束日期 - 连续操作开始日期 desc) rn
    from (select a.操作员A岗,
    b.操作日期 as 连续操作结束日期,
    a.操作日期 as 连续操作开始日期
    from (select t.*,
    row_number() over(partition by 操作员A岗 order by 操作日期) rn
    from (SELECT *
    FROM (select 操作员A岗, 操作日期
    from TEST
    UNION
    select 操作员B岗, 操作日期
    from TEST)
    group by 操作日期, 操作员A岗) t) a,
    (select t.*,
    row_number() over(partition by 操作员A岗 order by 操作日期) rn
    from (SELECT *
    FROM (select 操作员A岗, 操作日期
    from TEST
    UNION
    select 操作员B岗, 操作日期
    from TEST)
    group by 操作日期, 操作员A岗) t) b
    where a.操作员A岗 = b.操作员A岗
    and a.操作日期 <= b.操作日期
    and b.操作日期 - a.操作日期 = b.rn - a.rn) t)
    where rn = 1
    and 连续工作时长 >= 30

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?