有没有办法建立逻辑以使多个条目的一个初始日期进一步扩展

时间:2019-01-03 20:25:58

标签: sql oracle plsql

Exception

我只想获取进一步延期离开的初始日期,因为所有条目都将被视为一个初始日期。如何在列Emp_no | from_date | To_date | Initial_date -------+------------+-----------+------------- 234 | 01-Dec-18 | 10-Dec-18 | 01-Dec-18 234 | 11-Dec-18 | 05-Jan-19 | 01-Dec-18 234 | 06-Jan-19 | 20-Jan-19 | 01-Dec-18 234 | 21-Jan-19 | 25-Jan-19 | 01-Dec-18 中获得上述结果?

这是一项额外的功能,用于计算休假管理软件中已批准或已获得的服务假总数,因为在以下情况下,员工每月可获得4份假:

  1. 一个月需要参加16天的活动才能赚取假。
  2. 如果休假连接两个月,那么一个月的收入为 失去和其他月份的收入取决于16天出勤的第一条件。

所以我只想创建一个逻辑来整理已休假的假,并进一步延长到更多天,从而导致多次输入连续休假。

2 个答案:

答案 0 :(得分:0)

尝试以下方式

select emp_id, from_date, to_date, (select min(from_date) 
                                    from TABLE_NAME T1 
                                    where t1.emp_id = t.emp_id) as inital_date
from TABLE_NAME T
where emp_id = 234;

答案 1 :(得分:0)

不确定我是否理解您的要求,但请尝试:

select emp_no, from_date, to_date, level lvl,
       connect_by_root(from_date) initial_date
  from tbl t1
  start with 
    not exists (
      select 1 
        from tbl t2 
        where t1.emp_no = t2.emp_no and t1.from_date = t2.to_date + 1)
  connect by emp_no = prior emp_no and from_date = prior to_date + 1

dbfiddle demo

使用这些样本数据:

with tbl(emp_no, from_date, to_date) as (
    select 234, date '2018-12-01', date '2018-12-10' from dual union all
    select 234, date '2018-12-11', date '2019-01-05' from dual union all
    select 234, date '2019-01-06', date '2019-01-20' from dual union all
    select 234, date '2019-01-21', date '2019-01-25' from dual union all
    -- not continuous dates 
    select 234, date '2019-03-10', date '2019-03-17' from dual union all 
    select 234, date '2019-03-18', date '2019-03-25' from dual union all 
    -- other emp_no
    select 407, date '2018-12-15', date '2019-01-07' from dual )

...我们得到以下结果:

EMP_NO FROM_DATE   TO_DATE            LVL INITIAL_DATE
------ ----------- ----------- ---------- ------------
   234 2018-12-01  2018-12-10           1 2018-12-01
   234 2018-12-11  2019-01-05           2 2018-12-01
   234 2019-01-06  2019-01-20           3 2018-12-01
   234 2019-01-21  2019-01-25           4 2018-12-01
   234 2019-03-10  2019-03-17           1 2019-03-10
   234 2019-03-18  2019-03-25           2 2019-03-10
   407 2018-12-15  2019-01-07           1 2018-12-15

如果这不是您所需要的,请编辑您的问题并显示与更复杂的示例数据(例如上面的示例)匹配的必需输出。

说明:分层查询(connect by)针对每个emp_no不连续的日期查找,从这些点开始,将附加下一个连续的行。运算符connect_by_root用于表示initial_date