Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите сделать нестандартное ранжирование  [new]
Боря Ранжировщиков
Guest
Приветствую! Прошу помощи в написании запроса для следующей задачки:
Есть данные отсортированные по полю Num:
Num Name
1 Группа
2 Андрей
3 Саша
4 Петя
5 Группа
6 Коля
7 Боря
8 Группа
9 Вася

Надо получить:
Num Name   RN
1 Группа 0
2 Андрей 1
3 Саша 2
4 Петя 3
5 Группа 0
6 Коля 1
7 Боря 2
8 Группа 0
9 Вася 1

Разделителем фреймов для ранжирования служит значение "Группа" в поле Name. Для записей со значением поля Name = "Группа" поле RN вместо 0 можно заполнять любым значением или не заполнять вовсе. Задачка должна быть реализована с помощью select (без курсора).
21 июл 13, 02:28    [14594311]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать нестандартное ранжирование  [new]
Боря Ранжировщиков
Guest
Забыл уточнить: версия SQL Server 2005.
21 июл 13, 02:40    [14594319]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать нестандартное ранжирование  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
with CTE as (select * from (values
   (1, 'Группа'), (2, 'Андрей'), (3, 'Саша  '), (4, 'Петя  '),
   (5, 'Группа'), (6, 'Коля  '), (7, 'Боря  '),
   (8, 'Группа'), (9, 'Вася  ')
   )temp_CTE(Num, Name))
select * , Num-(select max(Num) from CTE where Name='Группа' and Num<=c.Num) gNum 
from CTE c
21 июл 13, 03:04    [14594330]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать нестандартное ранжирование  [new]
Боря Ранжировщиков
Guest
Спасибо, Сударь! То, что надо!
21 июл 13, 09:49    [14594398]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать нестандартное ранжирование  [new]
ytjrtyjrtyjrtyjrtyj
Guest
Боря Ранжировщиков,

with CTE as (select * from (values
   (1, 'Группа'), (2, 'Андрей'), (3, 'Саша  '), (4, 'Петя  '),
   (5, 'Группа'), (6, 'Коля  '), (7, 'Боря  '),
   (8, 'Группа'), (9, 'Вася  ')
   )temp_CTE(Num, Name))
select Num, [Name], case when g1 = 0 then 0 else row_number() over(partition by g1, q order by Num) end as RN
from
(
	select *, Num - row_number() over(partition by g1 order by Num) as q
	from
	(
		select *, case when Name = 'Группа' then 0 else 1 end g1
		from CTE
	) d

) s
order by Num
21 июл 13, 19:59    [14595768]     Ответить | Цитировать Сообщить модератору
 Re: Помогите сделать нестандартное ранжирование  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Спасибо, ytjrtyjrtyjrtyjrtyj! Ваш вариант хоть и универсальней в том плане, что допускает пропуски в поле Num, однако вариант Cygapb-007 оптимальней, даже после принудительного ранжирования по полю Num.
22 июл 13, 11:33    [14597876]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить