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

Откуда:
Сообщений: 70
Здравствуйте, в одном запросе нужно на основе двух столбцов (ID [IDENTITY], F1) получить вот такой третий (F2):

ID            F1            F2
1              7              1
2              7              1
3              7              1
4              34             2 
5              34             2 
6              7              3
7              34             4  
8              7              5
9              100            6
, который является счетчиком переходов между различными F1 с сортировкой по ID.

t-sql:
DECLARE @T TABLE (ID INT IDENTITY, F1 INT, F2 INT NULL)

INSERT @T SELECT 7, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 34, NULL
INSERT @T SELECT 34, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 34, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 100, NULL

SELECT * FROM @T
Долго без результатов мучал DENSE_RANK() и подобные..
5 мар 11, 12:29    [10330036]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая нумерация строк  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6166
a139,

start_of_group
5 мар 11, 12:38    [10330107]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая нумерация строк  [new]
AmKad
Member

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

Не претендуя на оптимальность
DECLARE @T TABLE (ID INT IDENTITY, F1 INT, F2 INT NULL)

INSERT @T SELECT 7, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 34, NULL
INSERT @T SELECT 34, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 34, NULL
INSERT @T SELECT 7, NULL
INSERT @T SELECT 100, NULL

select id, f1, dense_rank() over (order by dr) f2
from
   (select id, f1,
	min(id) over (partition by rn, f1) dr
	from
	   (select t.*,
		row_number() over                 (order by id) -
		row_number() over (partition by f1 order by id) rn
		from @t t
	   ) t
   )t
order by id;
5 мар 11, 12:45    [10330161]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая нумерация строк  [new]
Ё. Ракл
Guest
select *
from t
model 
ignore nav
dimension by (row_number() over(order by id) r ) -- если ID дырявый
measures (id, f1, 0 f2)
rules (
   f2[any] order by r = f2[cv()-1]+abs(sign(f1[cv()]-f1[cv()-1]))
);

R                      ID                     F1                     F2                     
---------------------- ---------------------- ---------------------- ---------------------- 
1                      1                      7                      1                      
2                      2                      7                      1                      
3                      3                      7                      1                      
4                      4                      34                     2                      
5                      5                      34                     2                      
6                      6                      7                      3                      
7                      7                      34                     4                      
8                      8                      7                      5                      
9                      9                      100                    6                      
5 мар 11, 12:51    [10330199]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая нумерация строк  [new]
a139
Member

Откуда:
Сообщений: 70
Ё. Ракл, веткой слегка ошиблись? =)
5 мар 11, 12:58    [10330258]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая нумерация строк  [new]
a139
Member

Откуда:
Сообщений: 70
env, AmKad, Спасибо!
5 мар 11, 19:33    [10331651]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Хитрая нумерация строк  [new]
MaximB
Member

Откуда:
Сообщений: 1
AmKad,
если не сложно, поясните пожалуйста логику которой вы руководствовались при составлении запроса. Что почитать на эту тему?
21 апр 14, 21:28    [15912958]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая нумерация строк  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Начать можно с этого.
Остальное в BOL-е.
22 апр 14, 12:45    [15915319]     Ответить | Цитировать Сообщить модератору
 Re: Хитрая нумерация строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
MaximB,

выполните отдельно
select id
,row_number() over(order by id) n
,row_number() over (partition by f1 order by id) r
,row_number() over(order by id) - row_number() over (partition by f1 order by id) rn
from @t t
order by id;
и внимательно смотрите на результат до полного просветления.
22 апр 14, 12:57    [15915429]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить