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

Откуда:
Сообщений: 860
Коллеги, прошу помощи.

Есть таблица, которая содержит поток начала действия какого-то ключа ID2 для ключа ID:

Create table #T
(ID int,
ID2 int,
DBEG datetime)

insert into #T (ID, ID2, DBEG)
Values (1, 1, '19900101'),
(1, 1, '19910101'),
(1, 1, '19930101'),
(1, 2, '19920101'),
(1, 2, '19940101'),
(1, 3, '19950101')


Необходимо получить таблицу с интервалами дат, когда для ID действовал ключ ID2

1, 1, '19900101', '19920101'
1, 2, '19920101', '19930101'
1, 1, '19930101', '19940101'
1, 2, '19940101', '19950101'
1, 3, '19950101', NULL

Т.е., для ключа ID=1 ключ ID2=1 действовал с 19900101 по момент появления ID2=2 (19920101)
Ключ ID2=2 действовал с момента своего первого появления 19920101 до момента, когда опять появился ключ ID2=1 (19930101)
и т.д.
Ключ ID2=3 последний в потоке для ID=1, поэтому дата окончания для него NULL.

ИМХО задачка частая, но в FAQ - не нашел!
1 фев 16, 17:47    [18758090]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом! Как получить начало и конец интервала действия ключа.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Поиск по форуму
1 фев 16, 17:55    [18758118]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом! Как получить начало и конец интервала действия ключа.  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
uaggster,

lead или lag over ()
1 фев 16, 17:57    [18758123]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом! Как получить начало и конец интервала действия ключа.  [new]
uaggster
Member

Откуда:
Сообщений: 860
WarAnt,
И как это прикрутить? Интервалы то не чередующиеся.
См. в исходной таблице вторая строка 1, 1, '19910101' - выпадает.
Т.е. если дата начала действия ключа находится в отрезке, когда этот ключ уже действует, эта строка игнорируется.
1 фев 16, 19:46    [18758460]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом! Как получить начало и конец интервала действия ключа.  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
uaggster
Т.е. если дата начала действия ключа находится в отрезке, когда этот ключ уже действует, эта строка игнорируется.
И как вы определяете этот отрезок, если даты окончания действия в явном виде нету?
1 фев 16, 19:59    [18758502]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом! Как получить начало и конец интервала действия ключа.  [new]
uaggster
Member

Откуда:
Сообщений: 860
invm
uaggster
Т.е. если дата начала действия ключа находится в отрезке, когда этот ключ уже действует, эта строка игнорируется.
И как вы определяете этот отрезок, если даты окончания действия в явном виде нету?

Дата окончания действия одного ключа = дате начала действия другого ключа (с кодом, отличным от текущего).
Собственно, задача как раз в том, чтобы поток "ключ - начало действия" преобразовать в "ключ - начало действия - конец действия", с условием что а) событие "начало действия" может приходиться в интервал, когда этот самый ключ уже действует (в этом случае это событие полностью игнорируется, см. 2 стр. исходных данных) и б) то, что ключ прекратил действие (т.к. начал действовать другой) - совершенно не значит, что он не начнет действовать когда-нибудь снова.
И да, еще. Даты - уникальны.
2 фев 16, 09:02    [18759685]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом! Как получить начало и конец интервала действия ключа.  [new]
aleks2
Guest
Мое мнение: тредстартер знатный балабол. А поговорить не с кем.

ЗЫ. Эти интервалы уже перемусолили 100500 раз.

1. Нумеруем по-порядку
2. Join со сдвигом на 1 по номеру.
3. Все.
3 фев 16, 06:01    [18765113]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом! Как получить начало и конец интервала действия ключа.  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
with s as
(
 select
  ID, ID2, DBEG,
  row_number() over (partition by ID order by DBEG) - row_number() over (partition by ID, ID2 order by DBEG) as g
 from
  #T
)
select
 ID, ID2, min(DBEG), lead(max(DBEG)) over (order by max(DBEG))
from
 s
group by
 ID, ID2, g
order by
 ID, min(DBEG);
3 фев 16, 10:32    [18765620]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить