SQL: сделать небольшие пролеты в 1 большой непрерывный промежуток - PullRequest
0 голосов
/ 27 сентября 2019

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

         ID       Type         Start           End
         1         A            01/01/2017     02/01/2017
         1         A            02/01/2017     03/01/2017
         1         A            03/01/2017     05/01/2017
         1         A            04/01/2017     06/01/2017
         1         A            09/01/2017     10/01/2017

В настоящее время я делаю следующее

   SELECT 
       A.ID,
       A.Type,
       B.Start,
       A.End
   FROM my_data as A
   INNER JOIN my_data as B
       ON A.ID = B.ID
       AND A.start>B.start
       AND A.start < B.end
   WHERE A.type = B.Type
    AND A.end-B.start <=365;

, чтобы получить набор данныхгде, если идентификатор имеет тот же тип, и промежутки между началом / концом не имеют НИКАКИХ промежутков между ними (но они могут перекрываться), первый запуск - это начало, а последний конец - это конец (и они не выходят за пределы года, то есть самого раннего началауже 01.01.2017, но некоторые цели могут наступить в 2018 году, мы хотим остановить их в последний день года).

В настоящее время мы получаем такой набор данных:

     ID       Type        Start            End    
      1        A           01/01/2017      03/01/2017
      1        A            02/01/2017      05/01/2017
      1        A            04/01/2017      06/01/2017

И я просто повторяю аналогичную логику в новой таблице.Но в реальной жизни это занимает столько раз, что кажется, что должно быть более простое решение.

Таблица, которую я хочу, выглядит примерно так:

        ID          Type     Start           End
         1           A       01/01/2017      06/01/2017 
         1           A       09/01/2017      10/01/2017

1 Ответ

0 голосов
/ 27 сентября 2019

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

SELECT 
   ID
  ,Type
  -- split the period back into seperate dates
  ,Begin(pd) AS Start
  ,End(pd) AS End
FROM
 (
   SELECT NORMALIZE 
      ID
     ,Type
     -- NORMALIZE only works with periods, so create it on the fly
     ,PERIOD(Start, End) AS pd
   FROM my_data 
 ) AS dt
...