Тупик !!! Терадата SQL. Как извлечь значения MIN / MAX из таблицы истории для каждого изменения группы с повторяющимися группами с течением времени? - PullRequest
1 голос
/ 01 мая 2020

Я извлекаю подмножество столбцов из таблицы истории (с датой вступления в силу), но мне нужно сжать их, чтобы отображались только изменения соответствующих значений. Мне нужно сжать, потому что таблица истории отслеживает изменения столбцов день за днем ​​и имеет новую строку для любого изменения столбца в таблице. См. Ниже отсортированный набор результатов. Мне нужно тянуть MIN (eff_dt) MAX (exp_dt) каждый раз, когда меняется электронная почта.

ID EMAIL EFF_DT EXP_DT 
486007909 ? 7/22/2009 7/22/2009
486007909 ? 7/23/2009 7/23/2009
486007909 B@L.COM 7/24/2009 8/2/2009
486007909 B@L.COM 8/3/2009 8/10/2009
486007909 B@L.COM 8/11/2009 9/6/2013
486007909 ? 9/7/2013 10/22/2014
486007909 ? 10/23/2014 11/3/2014
486007909 B@L.COM 11/4/2014 12/1/2016

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Teradata имеет собственное расширение для нормализации перекрывающихся периодов:

SELECT id, email
  -- split the period back into seperate columns
  ,Begin(pd)
  -- reverts NEXT = last included date
  ,Last(pd)
FROM
 ( -- NORMALIZE works on periods only
   SELECT NORMALIZE id, email,
      -- periods include begin, but exclude end
      -- modify end_dt accordingly
      PERIOD(eff_dt, NEXT(exp_dt)) AS pd
   FROM tab
 ) AS dt
1 голос
/ 02 мая 2020

Я думаю, что это проблема разрыва и островов. В этом случае вы можете использовать разницу номера строки:

select id, email, min(eff_dt), max(exp_dt)
from (select t.*,
             row_number() over (partition by id order by eff_dt) as seqnum,
             row_number() over (partition by id, email order by eff_dt) as seqnum_e
      from t
     ) t
group by email, (seqnum - seqnum_e);
...