Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Semen_v.2.01 Member Откуда: Сообщений: 17 |
товарищи! подскажите, пожалуйста! как бы так сформировать запрос, чтобы выполнялось следующее: пусть есть таблица 1:
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):
спасибо! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
31 июл 12, 15:04 [12941351] Ответить | Цитировать Сообщить модератору |
Semen_v.2.01 Member Откуда: Сообщений: 17 |
ms sql server 2008 |
31 июл 12, 15:05 [12941358] Ответить | Цитировать Сообщить модератору |
Geep Member Откуда: Москва Сообщений: 975 |
таблица номеров + подзапрос |
31 июл 12, 15:09 [12941405] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
user89 Member Откуда: Сообщений: 2083 |
Semen_v.2.01, Еще вариант. Кода много, но на больших данных, должно работать быстрее. Тут куча CTE, которые можно заменить на временные таблицы а-ля #tmp, повесить индексы.
Уверен, есть еще варианты... |
|
31 июл 12, 19:03 [12942988] Ответить | Цитировать Сообщить модератору |
интересно
Guest |
[quote user89]Уверен, есть еще варианты...[/qoute] Да, действительно. Хотелось бы увидеть еще варианты. |
1 авг 12, 17:03 [12947831] Ответить | Цитировать Сообщить модератору |
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 | ![]() |