Есть ли способ построить логику, чтобы получить одну начальную дату нескольких записей листьев продлен дальше - PullRequest
0 голосов
/ 03 января 2019
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 

Я просто хочу получить начальную дату дальнейших расширенных листьев, так как все записи будут рассматриваться как одна начальная дата.Как я могу получить вышеупомянутый результат в столбце Initial_date?

Это добавление дополнительной функциональности для расчета общего разрешенного или заработанного отпуска службы в программном обеспечении управления отпусками, поскольку в каждом месяце 4 отпускабыли заработаны сотрудниками на следующих условиях:

  1. В течение месяца необходимо 16 дней посещения, чтобы заработать отпуска.
  2. Если отпуск связывает два месяца, то зарабатывание одного месяцабудет потеряно, а заработок другого месяца зависит от первого условия 16-дневной посещаемости.

Так что я просто хочу создать логику, чтобы отсортировать эти виды отпусков, которые были взяты и продленыдо нескольких дней, что приводит к нескольким записям продолженных листьев.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Не уверен, что я понял ваши требования, но давайте попробуем:

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.

0 голосов
/ 03 января 2019

Попробуйте что-нибудь вроде

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...