Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Реализация джоина по ключу и временному промежутку.  [new]
baza906
Member

Откуда:
Сообщений: 283
Добрый вечер, всех с прошедшими праздниками! Суть вопроса: имеется процедура, реализующая джоин двух таблиц по ключу (может быть несколько полей) и временным интервалам "from" и "to" в формате datetime, пересекая их. Т.е. на выходе получается набор интервалов, не пересекающихся по данному ключу. (пример: 2 интервала а) c 2013-01-01 по 2013-07-01 и б) с 2013-04-01 по 2013-10-01 превратятся в c 2013-01-01 по c 2013-04-01, с c 2013-04-01 по c 2013-07-01 и c 2013-07-01 по c 2013-10-01 (формат yyyy-mm-dd) ). Сейчас процедура работает путем считывания двух столбцов (from и to) в один, с дальнейшим их выстраиванием по величине, т.e. первый будем from, второй to и т.д.
Могли бы коллеги, имеющие опыт в реализации подобных джоинов, поделиться своим опытом, либо указать изъяны в методе, которые бросились в глаза?
8 янв 15, 18:20    [17094785]     Ответить | Цитировать Сообщить модератору
 Re: Реализация джоина по ключу и временному промежутку.  [new]
Добрый Э - Эх
Guest
baza906,

unpivot + lead/lag. ну и поверх всего этого - where до кучи, чтобы отсеять строку с открытой date_to
8 янв 15, 19:14    [17094949]     Ответить | Цитировать Сообщить модератору
 Re: Реализация джоина по ключу и временному промежутку.  [new]
baza906
Member

Откуда:
Сообщений: 283
Добрый Э - Эх, ну вместо отсеивания у нас задается параметр, для последнего значения в функции LEAD. А как применяется UNPIVOT в данном случае? В таблице много столбцов, помимо from, to и ключевых полей
8 янв 15, 21:12    [17095219]     Ответить | Цитировать Сообщить модератору
 Re: Реализация джоина по ключу и временному промежутку.  [new]
Добрый Э - Эх
Guest
baza906,

х.з. какая там у тебя таблица по структуре и наполнению.
Но вот банальный пример преобразования твоих диапазонов из одного вида в другой:

--
-- Тестовые данные (два пересекающихся диапазона):
with
  t as 
    (
      select '2013-01-01' as date_from, '2013-07-01' as date_to union all
      select '2013-04-01' as date_from, '2013-10-01' as date_to
    )
--
-- Основной запрос (на выходе даст три непересекающихся диапазона, 
-- всё как в твоем словесном описании задачи)
select *
  from (
         select value as new_date_from, 
                lead(value) over(order by value) as new_date_to
           from t unpivot (value for x_date in (date_from, date_to)) unpvt
       )v
 where new_date_to is not null

З.Ы.
Ввиду недоступности он-лайн сервера с MS SQL Server 2012/2014 запрос на работоспособность не проверял...
8 янв 15, 22:40    [17095358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить