Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Легко визуально, тяжело технически  [new]
qv41
Guest
MSSQL 2012
Есть исходная таблица
DECLARE @t1 table(
	ID int identity,
	ping bit
)

INSERT INTO @t1 VALUES(0),(0),(0),(0),(1),(1),(1),(1),(1),(1),(0),(0),(0)
DELETE FROM @t1 WHERE id in(2,6)

Как в результате получить колонку gr к исходной таблице, кроме как циклом построчно ничего не приходит
ID          ping  gr
----------- ----- -----------
1 0 1
3 0 1
4 0 1
5 1 2
7 1 2
8 1 2
9 1 2
10 1 2
11 0 3
12 0 3
13 0 3
13 июн 15, 17:33    [17767059]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
ЦБ
Member [заблокирован]

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

В поиске по форуму забей "инвариант"
13 июн 15, 17:45    [17767101]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
qv41
Guest
спс
13 июн 15, 17:58    [17767125]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
MSSQLBug
Guest
ЦБ
qv41,
В поиске по форуму забей "инвариант"

Что-то вроде:
SELECT id, ping, 1 + SUM(change) OVER (ORDER BY id) as gr
  FROM (
       SELECT *, CASE WHEN (LAG(ping) OVER (ORDER BY id)) <> ping
                      THEN 1 ELSE 0 END as change
  FROM @t1
  ) AS a

Рекомендую порешать упражнения на sql-ex.ru, гораздо меньше таких вопросов будет возникать. ;)
13 июн 15, 17:58    [17767126]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
qv41
Guest
спс, с sql-ex знаком в первой 100 заданий такого нет
13 июн 15, 18:00    [17767131]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
;with t0 as
(
   select row_number() over(order by id) - row_number() over(order by ping, id) as n
   from @t1
)
select dense_rank() over(order by n) as n
from t0;
13 июн 15, 18:04    [17767141]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
не катит, тебе ж надо порядок сохранить...
13 июн 15, 18:06    [17767147]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
qv41
Guest
Ага тоже рабочий вариант, спс
13 июн 15, 18:07    [17767149]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
qv41
Guest
а... да
13 июн 15, 18:08    [17767154]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
;with t0 as
(
   select *, row_number() over(order by id) - row_number() over(partition by ping order by id) as n
   from @t1
)
select id, ping, dense_rank() over(order by n) as gr
from t0
order by id;

id          ping  gr
----------- ----- --------------------
1 0 1
3 0 1
4 0 1
5 1 2
7 1 2
8 1 2
9 1 2
10 1 2
11 0 3
12 0 3
13 0 3
13 июн 15, 19:23    [17767326]     Ответить | Цитировать Сообщить модератору
 Re: Легко визуально, тяжело технически  [new]
ЦБ
Member [заблокирован]

Откуда:
Сообщений: 2773
ЦБ
;with t0 as
(
   select *, row_number() over(order by id) - row_number() over(partition by ping order by id) as n
   from @t1
)
select id, ping, dense_rank() over(order by n) as gr
from t0
order by id;

В общем случае (например таком
ID          ping
----------- -----
1 0
2 1
3 0
4 1
неправильно "рисует".

На 2005-ом, что-то типа такого можно
;with t0 as
(
	select *, row_number() over(order by id) - row_number() over(partition by ping order by id) as n
	from @t1
),
t as 
(
	select min(id) as min_id, n, ping 
	from t0
	group by n, ping
)

select a.id, a.ping, dense_rank() over(order by b.min_id) as gr
from t0 a inner join t b on a.n=b.n and a.ping=b.ping
order by id;
15 июн 15, 09:31    [17770664]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить