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

Откуда: Донецк
Сообщений: 192
Здравствуйте. Помогите решить такую задачку.
Имеется таблица вида:
codevaluedatefromdateto
112013.03.012013.03.09
112013.03.102013.03.14
112013.03.152013.03.17
102013.03.182013.03.22
112013.03.232013.03.26
122013.03.272013.03.30
122013.03.302013.03.31

Нужно получить:
codevaluedatefromdateto
112013.03.012013.03.17
102013.03.182013.03.22
112013.03.232013.03.26
122013.03.272013.03.31

Т.е. нужно получить периоды изменения значения.
MSSQL 2012.
Заранее спасибо за помощь.
18 мар 13, 16:57    [14063559]     Ответить | Цитировать Сообщить модератору
 Re: Получение периодов изменения значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY code ORDER BY datefrom)-ROW_NUMBER()OVER(PARTITION BY code,value ORDER BY datefrom),* FROM @T)
SELECT code,value,datefrom=MIN(datefrom),dateto=MAX(dateto)
FROM CTE
GROUP BY code,value,N
ORDER BY MIN(datefrom);
18 мар 13, 17:11    [14063640]     Ответить | Цитировать Сообщить модератору
 Re: Получение периодов изменения значения  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
ищите по словам "инвариант периодов"
18 мар 13, 17:13    [14063649]     Ответить | Цитировать Сообщить модератору
 Re: Получение периодов изменения значения  [new]
lioner
Member

Откуда: Донецк
Сообщений: 192
iap
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY code ORDER BY datefrom)-ROW_NUMBER()OVER(PARTITION BY code,value ORDER BY datefrom),* FROM @T)
SELECT code,value,datefrom=MIN(datefrom),dateto=MAX(dateto)
FROM CTE
GROUP BY code,value,N
ORDER BY MIN(datefrom);


Этот скрипт опять же вернул те же самые 7 строк.
18 мар 13, 17:26    [14063729]     Ответить | Цитировать Сообщить модератору
 Re: Получение периодов изменения значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
lioner
iap
WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY code ORDER BY datefrom)-ROW_NUMBER()OVER(PARTITION BY code,value ORDER BY datefrom),* FROM @T)
SELECT code,value,datefrom=MIN(datefrom),dateto=MAX(dateto)
FROM CTE
GROUP BY code,value,N
ORDER BY MIN(datefrom);


Этот скрипт опять же вернул те же самые 7 строк.
Да что Вы говорите?
Что я делаю не так?
DECLARE @T TABLE(code INT,value INT,datefrom DATE,dateto DATE);
INSERT @T(code,value,datefrom,dateto)VALUES
 (1,1,'20130301','20130309')
,(1,1,'20130310','20130314')
,(1,1,'20130315','20130317')
,(1,0,'20130318','20130322')
,(1,1,'20130323','20130326')
,(1,2,'20130327','20130330')
,(1,2,'20130330','20130331');

WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY code ORDER BY datefrom)-ROW_NUMBER()OVER(PARTITION BY code,value ORDER BY datefrom),* FROM @T)
SELECT code,value,datefrom=MIN(datefrom),dateto=MAX(dateto)
FROM CTE
GROUP BY code,value,N
ORDER BY MIN(datefrom);
18 мар 13, 17:34    [14063776]     Ответить | Цитировать Сообщить модератору
 Re: Получение периодов изменения значения  [new]
lioner
Member

Откуда: Донецк
Сообщений: 192
iap
lioner
пропущено...


Этот скрипт опять же вернул те же самые 7 строк.
Да что Вы говорите?
Что я делаю не так?
DECLARE @T TABLE(code INT,value INT,datefrom DATE,dateto DATE);
INSERT @T(code,value,datefrom,dateto)VALUES
 (1,1,'20130301','20130309')
,(1,1,'20130310','20130314')
,(1,1,'20130315','20130317')
,(1,0,'20130318','20130322')
,(1,1,'20130323','20130326')
,(1,2,'20130327','20130330')
,(1,2,'20130330','20130331');

WITH CTE AS(SELECT N=ROW_NUMBER()OVER(PARTITION BY code ORDER BY datefrom)-ROW_NUMBER()OVER(PARTITION BY code,value ORDER BY datefrom),* FROM @T)
SELECT code,value,datefrom=MIN(datefrom),dateto=MAX(dateto)
FROM CTE
GROUP BY code,value,N
ORDER BY MIN(datefrom);


Извиняюсь... сори... Вычитание второго роунамбера, не заметил, думал это знак коментария "--".

Работает! Спасибо большое.
18 мар 13, 17:38    [14063801]     Ответить | Цитировать Сообщить модератору
 Re: Получение периодов изменения значения  [new]
Добрый Э - Эх
Guest
HandKot
ищите по словам "инвариант периодов"
как вариант, можно поискать по start_of_group.
Если мне память не изменяет, то для 2012 версии сервера я показывал этот вариант ...
18 мар 13, 17:59    [14063929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить