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

Откуда:
Сообщений: 103
Здравствуйте.

Подскажите, пожалуйста, как можно из такого:

idna
110
120
131
140
151
160
170
210
221
231
241


получить такое:

idnar
1101
1201
1312
1403
1514
1605
1705
2101
2212
2312
2412


То есть для каждого id нужно обозначить смену значения a, упорядочивая по n.
Подскажите хотя бы как такая функция называется.
Только не курсором.
8 сен 11, 15:37    [11248508]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Ejhi
Member

Откуда:
Сообщений: 103
Нутром чую, что DENSE_RANK() может помочь, но правильно применить не могу.
8 сен 11, 15:37    [11248520]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ejhi,

declare @t table (id int, n int, a int)
insert @t values
(1,1,0),
(1,2,0),
(1,3,1),
(1,4,0),
(1,5,1),
(1,6,0),
(1,7,0),
(2,1,0),
(2,2,1),
(2,3,1),
(2,4,1)

select *, rn1-rn2, DENSE_RANK() over(partition by id,a order by (rn1-rn2)) * 2 - (1-a) r
from(
	select *, ROW_NUMBER() over(partition by id order by n) rn1,
		ROW_NUMBER() over(partition by id, a order by n) rn2
	from @t
)t
order by id, n
8 сен 11, 16:53    [11249329]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
SET NOCOUNT ON;
DECLARE @T TABLE(id INT,n INT,a INT);
INSERT @T(id,n,a)VALUES
 (1,1,0)
,(1,2,0)
,(1,3,1)
,(1,4,0)
,(1,5,1)
,(1,6,0)
,(1,7,0)
,(2,1,0)
,(2,2,1)
,(2,3,1)
,(2,4,1);

WITH
 T1(G,id,n,a) AS(SELECT ROW_NUMBER()OVER(PARTITION BY id ORDER BY n)-ROW_NUMBER()OVER(PARTITION BY id ORDER BY a),id,n,a FROM @T)
,T2(id,n,a,r)AS(SELECT id,n,a, MIN(n)OVER(PARTITION BY id,G,a)FROM T1)
SELECT id,n,a,r=DENSE_RANK()OVER(PARTITION BY id ORDER BY r)
FROM T2
ORDER BY id,n;
8 сен 11, 16:56    [11249365]     Ответить | Цитировать Сообщить модератору
 Re: Группировка  [new]
Ejhi
Member

Откуда:
Сообщений: 103
Ништяк! Спасибо большое!

Так и знал, что DENSE_RANK() пригодится.
8 сен 11, 17:15    [11249553]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить