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

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Доброго времени суток, All!
Возникла проблема группировки, заключается она в следующем:

create table #tmp(id int, flag int)
Insert into #tmp
select 1,0 union all
select 2,0 union all
select 3,0 union all
select 4,0 union all
select 5,1 union all
select 6,1 union all
select 7,1 union all
select 8,1 union all
select 9,0 union all
select 10,0 union all
select 11,0 union all
select 12,1 union all
select 13,1 union all
select 14,0 union all
select 15,1 union all
select 16,1
select row_number() over(partition by flag order by id) as part, * from #tmp order by id
выдает следующее:
part id flag
-------------------- ----------- -----------
1 1 0
2 2 0
3 3 0
4 4 0
1 5 1
2 6 1
3 7 1
4 8 1
5 9 0
6 10 0
7 11 0
5 12 1
6 13 1
8 14 0
7 15 1
8 16 1
Подскажите пожалуйста, как бы так попросить сервер, чтобы он выдал вот так:
part id flag
-------------------- ----------- -----------
1 1 0
2 2 0
3 3 0
4 4 0
1 5 1
2 6 1
3 7 1
4 8 1
1 9 0
2 10 0
3 11 0
1 12 1
2 13 1
1 14 0
1 15 1
2 16 1
То есть, чтобы при каждой смене флага, row_number начинал отсчет сначала?

Заранее благодарен.
20 сен 12, 23:35    [13199120]     Ответить | Цитировать Сообщить модератору
 Re: проблема группировки.  [new]
qwerty112
Guest
select id, flag,
row_number() over(partition by xz order by id) as xz
from

(select *, 
case when flag=1 then 1 else -1 end * (id - row_number() over(partition by flag order by id)) as xz
from #tmp) a

order by id

id          flag        xz
----------- ----------- --------------------
1           0           1
2           0           2
3           0           3
4           0           4
5           1           1
6           1           2
7           1           3
8           1           4
9           0           1
10          0           2
11          0           3
12          1           1
13          1           2
14          0           1
15          1           1
16          1           2
20 сен 12, 23:48    [13199157]     Ответить | Цитировать Сообщить модератору
 Re: проблема группировки.  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
qwerty112
case when flag=1 then 1 else -1 end 

flag*2-1
:)
20 сен 12, 23:54    [13199176]     Ответить | Цитировать Сообщить модератору
 Re: проблема группировки.  [new]
HukoJIau
Member

Откуда:
Сообщений: 8
Makar4ik,
select row_number() over( partition by t0.flag, t1.sect
                          order by t0.id ) as part
     , t0.*
  from #tmp t0
  join ( select id
              , id - row_number() over( partition by flag
                                        order by id ) as sect
           from #tmp ) t1 on t0.id = t1.id
  order by t0.id
20 сен 12, 23:55    [13199179]     Ответить | Цитировать Сообщить модератору
 Re: проблема группировки.  [new]
HukoJIau
Member

Откуда:
Сообщений: 8
Если уменьшаемое в подзапросе (id) заменить на
row_number() over( order by id )
с "дырами" в id тоже попрет
21 сен 12, 00:12    [13199245]     Ответить | Цитировать Сообщить модератору
 Re: проблема группировки.  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Спасибо большое!

В результате остановился на варианте

select id, flag,
row_number() over(partition by xz order by id) as xz
from
(select *,
flag*2-1 * (row_number() over(order by id ) - row_number() over(partition by flag order by id)) as xz
from #tmp) a
order by id
21 сен 12, 18:16    [13204341]     Ответить | Цитировать Сообщить модератору
 Re: проблема группировки.  [new]
qwerty112
Guest
Makar4ik
select id, flag,
row_number() over(partition by xz order by id) as xz
from
(select *,
(flag*2-1) * (row_number() over(order by id ) - row_number() over(partition by flag order by id)) as xz
from #tmp) a
order by id
21 сен 12, 18:21    [13204363]     Ответить | Цитировать Сообщить модератору
 Re: проблема группировки.  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
qwerty112
(flag*2-1) 
да, конечно.
Просто переписывал ручками, а не копировал.
(между терминалками не всегда CTRL+V работает)

еще раз спасибо.
21 сен 12, 22:06    [13204902]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить