Таблица циклов (создать строку для каждого изменения) - PullRequest
0 голосов
/ 29 января 2019

Мне нужно создать таблицу «циклов», по одной строке на каждое обновление.В приведенной ниже таблице показаны две строки, но под идентификатором может быть много назначений.

У меня есть таблица ниже:

ID  class_start class_end enroll_dt reason assignments cat_added 
 1   1/10/19     1/22/19   1/18/19  stop   1/14/19     1/10/19    
 1   1/10/19     1/22/19   1/18/19  stop   1/22/19     1/10/19

Ожидаемые результаты:

class_start class_end  start_dt   end_dt    enroll_dt  reason  assignments  cat_added      
 1/10/19               1/10/19    1/13/19                                     1/10/19                                                                                                        
 1/10/19               1/14/19    1/17/19                        1/14/19      1/10/19
 1/10/19               1/18/19    1/21/19     1/18/19            1/14/19      1/10/19
 1/10/19     1/22/19   1/22/19    12/31/9999  1/18/19  stop      1/22/19      1/10/19    

1 Ответ

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

Вы не объяснили бизнес-логику, которую пытаетесь реализовать.Следовательно, это решение просто жестко кодирует некоторые правила, основанные на ваших опубликованных данных .

Он использует connect by level для порождения нескольких строк из одной входной строки (в данном случае это подзапрос на основе двойного) и тестирует level для условного заполнения столбцов в наборе результатов.

with cte as (
         select to_date( '1/7/19', 'MM/DD/YY') as class_start,
                to_date( '1/14/19', 'MM/DD/YY') as class_end,
                to_date( '1/9/19', 'MM/DD/YY') as enroll_dt,
                'early' as reason 
         from dual
) 
select cte.class_start
        , case when level = 3 then cte.class_end 
          end as class_end
        , case when level = 1 then cte.class_start
               when level = 2 then cte.enroll_dt
               else cte.class_end - 1
          end as st_dt
        , case when level = 1 then cte.enroll_dt - 1
               when level = 2 then cte.class_end 
               else date '9999-12-31'
          end as end_dt
        , case when level > 1 then cte.enroll_dt end as enroll_dt 
        , case when level = 3 then cte.reason end as reason
from cte
connect by level <= 3
/  

Вероятно, самая большая ошибка будет, если у вас более одной строки ввода.В этом сценарии вам понадобится идентифицированный, чтобы связать порожденные строки вместе.Предположительно в вашей реальной таблице есть какой-то идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...