Объедините две таблицы и найдите совпадающие даты и пробелы - PullRequest
0 голосов
/ 21 июня 2020

Я хотел бы решить приведенный ниже сценарий ios для ID 100 и 101 в соответствии с заданными выходными данными, используя oracle аналитические функции. есть идеи?

ТАБЛИЦА A:

ID   ValidFrom   ValidTo
100  1/1/2009    12/31/2010
100  1/1/2011    3/31/2012
101  8/1/2013    7/31/2014
101  8/1/2014    8/31/2014

ТАБЛИЦА B

ID   ValidFrom   ValidTo
100  11/1/2008   12/31/2011
100  2/1/2012    2/29/2012
101  8/1/2013    6/30/2014
101  7/1/2014    8/31/2014

ВЫХОД:

ID   ValidFrom   ValidTo
100  11/1/2008  12/31/2008
100  1/1/2009   12/31/2010
100  1/1/2011   12/31/2011
100  1/1/2012   1/31/2012
100  2/1/2012   2/29/2012
100  3/1/2012   3/31/2012
---------------------------
101  8/1/2013   6/30/2014
101  7/1/2014   7/31/2014
101  8/1/2014   8/31/2014

1 Ответ

0 голосов
/ 21 июня 2020

Этот запрос с использованием аналитики c lead() выполняет свою работу. Столбец note показывает, происходит ли строка из ваших данных или отсутствует пробел:

select id, d1, d2, case dir when 3 then 'GAP' end note 
  from (
    select id, 
           case when dir = 2 
                 and lead(dir) over (partition by id order by dt) = 1
                 and lead(dt) over (partition by id order by dt) <> dt + 1
                then dt + 1 
                else dt
           end d1,
           case when dir = 2 
                 and lead(dir) over (partition by id order by dt) = 1
                 and lead(dt) over (partition by id order by dt) <> dt + 1
                then 3 
                else dir
           end dir,
           case when lead(dir) over (partition by id order by dt) = 1 
                then lead(dt)  over (partition by id order by dt) - 1
                else lead(dt)  over (partition by id order by dt) 
            end d2
      from (
        select * from a unpivot (dt for dir in (validfrom as 1, validto as 2)) union 
        select * from b unpivot (dt for dir in (validfrom as 1, validto as 2)) ) )
  where dir in (1, 3)

dbfiddle demo

Сначала данные не сворачиваются, чтобы все даты были в одном столбце, это проще для дальнейшей аналитики. Union удаляет повторяющиеся значения. В столбце dir указывается дата: from или to. Тогда применяется lead логи c, в зависимости от типа этого направления. Думаю, это можно несколько упростить :)

...