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

данные
id data
11
22
35
44
57
67
77
813
96


нужно пронумеровать так по id, что бы получить значение нумерации было больше предыдущего и больше или равнялось полю data. т.е. нужно получить:

id data row_num
111
222
355
446
577
678
779
81313
9614
24 май 11, 15:55    [10700987]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация продолжая с большего  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
userGuest123456789,

рекурсивное CTE + CASE, если версия сервера позволяет
а это тестовое задание какое-то?
24 май 11, 16:05    [10701079]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация продолжая с большего  [new]
userGuest123456789
Guest
Как через рекурсивный сте? Где-то слышал такое, но не сталкивался. Это для отчета нужно, упростил задачу и без лишних деталей что бы было понятно.
24 май 11, 16:13    [10701156]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация продолжая с большего  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Shakill
рекурсивное CTE
Зачем?
Все и без него просто считается.

declare @t table (id int identity(1,1), data int)
insert @t (data) values (1),(2),(5),(4),(7),(7),(7),(13),(6)

select t1.id,t1.data,id-case when d<0 then d else 0 end d from @t t1
cross apply (select min(t2.id-t2.data)d from @t t2 where t1.id>=t2.id)t
Если есть пропуски в id, то сперва нумеруем выборку.
24 май 11, 16:24    [10701248]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация продолжая с большего  [new]
Валдай
Member

Откуда:
Сообщений: 113
;with w as
(
select *, 
  n1 = ROW_NUMBER()over(order by id),--(select COUNT(*) from @t where id <= t.id), 
  delta=case when (data - id)<0 then 0 else (data-id) end
from @t t
)
select id,data,row_num = n1+md
from
(
select *, md=(select MAX(delta) from w where id <= w1.id) 
from w w1
)x

ГЫ. Anddros на повороте обошел:)
24 май 11, 16:40    [10701377]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация продолжая с большего  [new]
userGuest123456789
Guest
Большое спасибо Anddros, Валдай

Первый вариант (Anddros) вообще не понял, можно объяснить? Второй (Валдай) более понятен, долго крутился вокруг да около подобного решения...
24 май 11, 16:52    [10701472]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация продолжая с большего  [new]
nezhadnye_my
Guest
userGuest123456789,
ну раз автор не объяснил, я попробую.
переписываем вот так:
declare @t table (id int identity(1,1), data int)
insert @t (data) values (1),(2),(5),(4),(7),(7),(7),(13),(6)

select t1.id,t1.data,
       id+case when d>0 then d else 0 end d 
from @t t1 cross apply (select max(t2.data-t2.id)d 
                        from @t t2 
                        where t2.id<=t1.id)t
что есть то же самое,
но объяснять проще:
для каждой пары id, data ищем макс. разность data-id по всем предыдyщим парам(наша пара включается)
и ее прибавляем к id
25 май 11, 12:43    [10705793]     Ответить | Цитировать Сообщить модератору
 Re: Нумерация продолжая с большего  [new]
userGuest123456789
Guest
nezhadnye_my,

Спасибо! надо по практиковать такой подход.
26 май 11, 11:44    [10711792]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить