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

Откуда:
Сообщений: 234
Всем привет.
Есть периоды двух типов: тип1 и тип2. Необходимо на их основе построить такие периоды, в которых промежутки между периодами типа1 займут периоды типа2 (если они есть).
Исходные данные
IF OBJECT_ID('tempdb..#tPeriod') IS NOT NULL
	DROP TABLE #tPeriod;
	
CREATE TABLE #tPeriod (SD datetime, ED datetime, PERIOD_TYPE smallint);

INSERT INTO #tPeriod
SELECT '2009-08-18','2011-08-18', 1
UNION ALL
SELECT '2011-09-30','2012-09-29', 1
UNION ALL
SELECT '2012-11-30','2014-11-30', 1
UNION ALL
SELECT '2007-04-19','2020-08-19', 2


Результат должен быть следующим
автор
19.04.2007 17.08.2009 2
18.08.2009 18.08.2011 1
19.08.2011 29.09.2011 2
30.09.2011 29.09.2012 1
30.09.2012 29.11.2012 2
30.11.2012 30.11.2014 1
01.12.2012 19.08.2020 2


Как сделать с аналитическими функциями - знаю. А можно без них?

Спасибо
26 ноя 14, 11:22    [16906697]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов с разными приоритетами  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Новичок_я,

пронумеруйте строки, используйте самообъединение со сдвигом в 1, так Вы найдёте пустые промежутки.
26 ноя 14, 13:11    [16907496]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов с разными приоритетами  [new]
Добрый Э - Эх
Guest
Новичок_я,

можно и без аналитики. но придется делать самообъединением. суть-то решения не изменится - развернуть диапазоны в точки, далее точки собрать в новые диапазоны. вместо lead/lag для доступа к "соседней" точке использовать apply top 1 подзапрос
26 ноя 14, 13:18    [16907549]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов с разными приоритетами  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Попробую.
Спасибо
26 ноя 14, 13:49    [16907784]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов с разными приоритетами  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Самообъединение уже делал, и периоды1 нумеровал (в пределах типа)
IF OBJECT_ID('tempdb..#tPeriod') IS NOT NULL
	DROP TABLE #tPeriod;
	
CREATE TABLE #tPeriod (SD datetime, ED datetime, PERIOD_TYPE smallint, ID int);

INSERT INTO #tPeriod
SELECT '2009-08-18','2011-08-18', 1, 1
UNION ALL
SELECT '2011-09-30','2012-09-29', 1, 2
UNION ALL
SELECT '2012-11-30','2014-11-30', 1, 3
UNION ALL
SELECT '2007-04-19','2020-08-19', 2, 1;

SELECT * FROM #tPeriod;

Период типа2 начинается до первого периода типа1, и заканчивается после последнего периода типа1. Итого должно получиться 4 периода типа2:
1) До первого периода типа1
2) между 1-2
3) между 2-3
4) после третьего периода типа1

Проблема в том, что самообъединением я могу получить только три пустых промежутка из списка выше: либо 1, 2 и 3, либо 2,3 и 4

Или я неправильно что-то делаю
26 ноя 14, 14:59    [16908432]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов с разными приоритетами  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Новичок_я,

Период типа 2 это еще одно объединение, т.е. второе. Первое - это объединение (левое) типа 1 самого с собой.
1 - 2
2 - 3
3 - null
26 ноя 14, 15:09    [16908536]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов с разными приоритетами  [new]
Добрый Э - Эх
Guest
Новичок_я,
with 
  tPoint 
    as (
         select sd as d, PERIOD_TYPE, 1 as pt from tPeriod 
         union all
         select ed, PERIOD_TYPE, 2 as pt from tPeriod
       )
----
select p0.d as sd, v.d as ed,
       case when p0.PERIOD_TYPE = 2 or p0.pt = 2 then 2 else 1 end as PERIOD_TYPE
  from tPoint p0
 cross apply (select top 1 d from tPoint p1 where p1.d > p0.d order by d) v
order by sd
on-line проверка на sqlfiddle.com
Единственное, что нужно "допилить" анализ начал-кончал диапазонов, чтобы решить, где делать "плюс" 1 день, где "минус" один день, а где ничего не делать...
26 ноя 14, 16:03    [16909050]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов с разными приоритетами  [new]
Новичок_я
Member

Откуда:
Сообщений: 234
Примерно понял, спасибо!
26 ноя 14, 16:47    [16909358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить