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

Откуда:
Сообщений: 17
товарищи!

подскажите, пожалуйста!

как бы так сформировать запрос, чтобы выполнялось следующее:

пусть есть таблица 1:
idvaluenumber
121713
133417
14519



declare @t table (id int, value int, number int)
insert @t select 12, 17, 13 union all select 13, 34, 17 union all select 14, 5, 19


нужно получить таблицу2,
которая заполняет отсутствующие значения number следующим образом: отсутствующим значениям в соответствие ставится последнее известное число, которому есть соответствующий number (нужны number c 1 до 50):

valuenumber
01
02
03
04
05
06
07
08
09
010
011
012
1713
1714
1715
1716
3417
3418
519




спасибо!
31 июл 12, 15:04    [12941351]     Ответить | Цитировать Сообщить модератору
 Re: замена нулевых элементов таблицы  [new]
Semen_v.2.01
Member

Откуда:
Сообщений: 17
ms sql server 2008
31 июл 12, 15:05    [12941358]     Ответить | Цитировать Сообщить модератору
 Re: замена нулевых элементов таблицы  [new]
Geep
Member

Откуда: Москва
Сообщений: 975
таблица номеров + подзапрос
31 июл 12, 15:09    [12941405]     Ответить | Цитировать Сообщить модератору
 Re: замена нулевых элементов таблицы  [new]
user89
Member

Откуда:
Сообщений: 2083
Semen_v.2.01,
declare @t table (id int, value int, number int)
insert @t select 12, 17, 13 union all select 13, 34, 17 union all select 14, 5, 19

;with a as (
  select 1 [min_num], max(number) [max_num] from @t
  union all
  select min_num + 1, max_num from a where min_num < max_num
)
select isnull(f.value,0) [value], a.min_num [number]
from a
left join @t t on a.min_num = t.number
outer apply (select top 1 value from @t where number <= a.min_num order by number desc) f

Это не самый быстрый вариант. Лучше, конечно, иметь в базе готовую, проиндексированную таблицу с номерами.
31 июл 12, 15:27    [12941542]     Ответить | Цитировать Сообщить модератору
 Re: замена нулевых элементов таблицы  [new]
user89
Member

Откуда:
Сообщений: 2083
Semen_v.2.01,

Еще вариант. Кода много, но на больших данных, должно работать быстрее. Тут куча CTE, которые можно заменить на временные таблицы а-ля #tmp, повесить индексы.
+
declare @t table (id int, value int, number int)
insert @t select 12, 17, 13 union all select 13, 34, 17 union all select 14, 5, 19

;with cte as (
  select *, t.id + a.n [i]
  from @t t
  cross join (select 0 [n] union all select 1) a
), tmp as (
  select cte.id, cte.value, cte.number, isnull(t.number - cte.number, 0) [razn]
  from cte
  left join @t t on cte.i = t.id-1
  where cte.n = 0
), res (id, value, number, razn, cnt) as (
  select id, value, number, razn, 1 from tmp
  union all
  select id, value, number, razn, cnt+1 from res where cnt < razn
), main as (
  select 1 [min_num], max(number) [max_num] from @t
  union all
  select min_num + 1, max_num from main where min_num < max_num
)
select isnull(res.value,0) [value], main.min_num [number]
from main
left join res on main.min_num = res.cnt + res.number - 1
order by id

Уверен, есть еще варианты...
31 июл 12, 19:03    [12942988]     Ответить | Цитировать Сообщить модератору
 Re: замена нулевых элементов таблицы  [new]
интересно
Guest
[quote user89]Уверен, есть еще варианты...[/qoute]
Да, действительно. Хотелось бы увидеть еще варианты.
1 авг 12, 17:03    [12947831]     Ответить | Цитировать Сообщить модератору
 Re: замена нулевых элементов таблицы  [new]
Yasha123
Member

Откуда:
Сообщений: 1955
declare @t table (id int, value int, number int)
insert @t select 12, 17, 13 union all select 13, 34, 17 union all select 14, 5, 19

;with cte as (
select *, ROW_NUMBER() over (order by id) as rn
from @t)

,cte_map as(
select isnull(t2.number, 1) as from_, isnull(t1.number - 1, t2.number) as to_, isnull(t2.value, 0) as val_
from cte t1 full join cte t2 on t1.rn = t2.rn + 1)

,c50 as(
select number
from master..spt_values
where type = 'P' and number between 1 and 50)

select t2.val_, t1.number
from c50 t1 inner join cte_map t2 on t1.number between t2.from_ and t2.to_
1 авг 12, 18:19    [12948412]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить