确定连续和独立的PTO天数 [英] Determining consecutive and independent PTO days

查看:0
本文介绍了确定连续和独立的PTO天数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据反馈,我正在调整我的问题。

我正在Presto数据库上使用SQL。

我的目标是报告自2018年初以来连续几天PTO或病假的员工。我想要的输出将是员工所用的各个时间岛以及开始和结束日期,如下所示:

我使用的主表是d_Employee_Time_Off

只有两个TIME_OFF_TYPE_NAME:PTO和病假。

DS是一个日期戳,我使用最新的DS(通常是当前日期)

我可以访问名为d_date的日期表

我可以在d_Employee_time_off.time_off_date=d_ate.ull_date

联接表

我希望我以一种易于理解的方式组织了这个问题。

推荐答案

我认为这里需要将休息日材料连接到日历表中。

在下面的示例解决方案中,我正在"即时"生成此解决方案,但我认为您确实有自己的解决方案。同样在我的例子中,我使用了字符串‘星期一’,并从该字符串向后移动(或者,您可以使用‘星期五’并向前移动)。我不热衷于语言相关的解决方案,但由于我不是Presto的用户,我无法在Presto上测试任何东西。因此,下面的示例使用了您自己的一些逻辑,但使用了SQL Server语法,我相信您可以将其转换为Presto:

查询:

;WITH
Digits AS (
          SELECT 0 AS digit UNION ALL
          SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL  
          SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL 
          SELECT 9
          )
, cal AS (
          SELECT 
                 ca.number
               , dateadd(day,ca.number,'20180101') as cal_date
               , datename(weekday,dateadd(day,ca.number,'20180101')) weekday
          FROM Digits [1s]
          CROSS JOIN Digits [10s]
          CROSS JOIN Digits [100s] /* add more like this as needed */
          cross apply (
              SELECT 
                      [1s].digit 
                    + [10s].digit * 10
                    + [100s].digit * 100  /* add more like this as needed */
                    AS number
              ) ca
          )
, time_off AS (
        select
            *
        from cal
        inner join mytable t on (cal.cal_date = t.time_off_date and cal.weekday <> 'Monday') 
                             or (cal.cal_date between dateadd(day,-2,t.time_off_date) 
                                  and t.time_off_date and datename(weekday,t.time_off_date) = 'Monday')
        )
, starting_points AS (
        SELECT
            employee_id,
            cal_date,
            dense_rank() OVER(partition by employee_id
                ORDER BY
                    time_off_date
            ) AS rownum
        FROM
            time_off A
        WHERE
            NOT EXISTS (
                SELECT
                    *
                FROM
                    time_off B
                WHERE
                    B.employee_id = A.employee_id
                    AND B.cal_date = DATEADD(day, -1, A.cal_date)
            )
    )
, ending_points AS (
        SELECT
            employee_id,
            cal_date,
            dense_rank() OVER(partition by employee_id
                ORDER BY
                    time_off_date
            ) AS rownum
        FROM
            time_off A
        WHERE
            NOT EXISTS (
                SELECT
                    *
                FROM
                    time_off B
                WHERE
                    B.employee_id = A.employee_id
                    AND B.cal_date = DATEADD(day, 1, A.cal_date)
            )
    )
SELECT
    S.employee_id,
    S.cal_date AS start_range,
    E.cal_date AS end_range
FROM
    starting_points S
JOIN
    ending_points E
    ON E.employee_id = S.employee_id
    AND E.rownum = S.rownum
order by employee_id
    , start_range

结果:

    employee_id start_range end_range
1   200035      02.01.2018  02.01.2018 
2   200035      20.04.2018  27.04.2018 
3   200037      27.01.2018  29.01.2018 
4   200037      31.03.2018  02.04.2018 

参见:http://rextester.com/MISZ50793

CREATE TABLE mytable(
   ID INT NOT NULL
  ,employee_id      INTEGER  NOT NULL
  ,type             VARCHAR(3) NOT NULL
  ,time_off_date         DATE  NOT NULL
  ,time_off_in_days INT NOT NULL
);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (1,200035,'PTO','2018-01-02',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (2,200035,'PTO','2018-04-20',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (3,200035,'PTO','2018-04-23',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (4,200035,'PTO','2018-04-24',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (5,200035,'PTO','2018-04-25',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (6,200035,'PTO','2018-04-26',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (7,200035,'PTO','2018-04-27',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (8,200037,'PTO','2018-01-29',1);
INSERT INTO mytable(id,employee_id,type,time_off_date,time_off_in_days) VALUES (9,200037,'PTO','2018-04-02',1);

这篇关于确定连续和独立的PTO天数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆