查找超过指定天数的任何人的最大连续缺勤天数

Posted

技术标签:

【中文标题】查找超过指定天数的任何人的最大连续缺勤天数【英文标题】:finding the max number of consecutive days of absence for any person who has more than a specified number of days 【发布时间】:2020-03-11 15:35:42 【问题描述】:

我正在处理缺勤报告,并且很难弄清楚如何获得员工连续缺勤 6 次或更多时的连续休假天数。我能够获得员工的最大人数,但如果员工在给定的开始和结束日期参数内发生了不止一个这种情况,那么这个最大缺勤次数只会给我最多的缺勤次数。以下数据集说明了我的意思:

  ClientID  EmplID   Date    AbsentFlag   NumOfDays  RowNum
      10    2587    2019-07-14     Y       1         4
      10    2587    2019-07-15     Y       2         5
      10    2587    2019-07-16     Y       3         6
      10    2587    2019-07-19     Y       4         7
      10    2587    2019-07-20     Y       5         8
      10    2587    2019-07-21     Y       6         9
      10    2587    2019-07-22     Y       7         10
      10    2587    2019-07-23     Y       8         11
      10    2587    2019-07-26     Y       9         12
      10    2587    2019-07-27     Y       10        13
      10    2587    2019-07-28     Y       11        14
      10    2587    2019-07-29     Y       12        15
      10    2587    2019-07-30     Y       13        16
      10    2587    2019-08-03     Y       1         17
      10    2587    2019-08-04     Y       2         18
      10    2587    2019-08-05     Y       3         19
      10    2587    2019-08-06     Y       4         20
      10    2587    2019-08-09     Y       5         21
      10    2587    2019-08-10     Y       6         22
      10    2587    2019-08-11     Y       7         23
      10    2587    2019-08-12     Y       8         24
      10    2587    2019-08-13     Y       9         25

例如,该员工连续缺勤 13 天(超过 6 天),以及连续缺勤 9 天(超过 6 天)。在我的报告中,我需要包括前 6 个缺勤日期,以及每次连续缺勤的总人数。所以对于结果,我希望是这样的:

 ClientID   EmplID   Days    Date1         Date2        Date3         Date4          Date5        Date6
    10      2587      13   2019-07-14    2019-07-15   2019-07-16    2019-07-19   2019-07-20    2019-07-21
    10      2587       9   2019-08-03    2019-08-04   2019-08-05    2019-08-06   2019-08-09    2019-08-10

目前,我得到了这个:

 ClientID   EmplID   Days    Date1         Date2        Date3         Date4          Date5        Date6
    10      2587      13   2019-07-14    2019-07-15   2019-07-16    2019-07-19   2019-07-20    2019-07-21
    10      2587      13   2019-08-03    2019-08-04   2019-08-05    2019-08-06   2019-08-09    2019-08-10

如果我能提供任何其他帮助解决此问题,请告诉我。谢谢。

【问题讨论】:

【参考方案1】:

您可以使用与numofdays 不同的序列来识别缺勤的第一天。然后聚合过滤:

select clientid, empid, max(days),
       max(case when numofdays = 1 then date end) as day_1,
       max(case when numofdays = 2 then date end) as day_2,
       max(case when numofdays = 3 then date end) as day_3,
       max(case when numofdays = 4 then date end) as day_4,
       max(case when numofdays = 5 then date end) as day_5,
       max(case when numofdays = 6 then date end) as day_6
from (select t.*,
             row_number() over (partition by clientid, empid order by date) as seqnum
      from t
     ) t
group by clientid, empid, (seqnum - numofdays)
having max(numofdays) >= 6

【讨论】:

以上是关于查找超过指定天数的任何人的最大连续缺勤天数的主要内容,如果未能解决你的问题,请参考以下文章

hive sql之:最大登录天数,获取连续登录指定天数

Hive计算最大连续登陆天数

spark sql 连续登录最大天数

SQL:连续天数的计算方法

hive实现用户连续登陆的最大天数

查找连续的服务天数,中间没有休息日