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

Откуда:
Сообщений: 53
Добрый день,

sql 2005 lead lag отсутсвуют

Как ещё можно в ms sql реализовать подобное заполнение (желательно не цикл) ?

NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
1111#
NULL - должно быть 1111#
2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
NULL - должно быть 2222#
08886
NULL - должно быть 08886
NULL - должно быть 08886
NULL - должно быть 08886
NULL - должно быть 08886
NULL - должно быть 08886
NULL - должно быть 08886
NULL - должно быть 08886

Спасибо
31 май 18, 14:12    [21457555]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36900
lead и lag бы вам не помогли, потому что отсутствует поле, задающее порядок.
31 май 18, 14:19    [21457587]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
svanrus
Member

Откуда:
Сообщений: 53
Гавриленко Сергей Алексеевич,

а если так ?



28.05.2018 14:40:04 1 NULL
28.05.2018 14:40:07 2 NULL
28.05.2018 14:41:04 3 NULL
28.05.2018 14:41:04 4 NULL
28.05.2018 14:41:04 5 NULL
28.05.2018 14:41:05 6 NULL
28.05.2018 14:42:21 7 NULL
28.05.2018 14:42:22 8 NULL
28.05.2018 14:44:32 9 NULL
28.05.2018 14:44:32 10 NULL
28.05.2018 14:45:08 11 NULL
28.05.2018 14:45:09 12 1111#
28.05.2018 14:46:25 13 NULL - должно быть 1111#
28.05.2018 14:46:25 14 2222#
28.05.2018 14:46:25 15 NULL - должно быть 2222#
28.05.2018 14:46:26 16 NULL - должно быть 2222#
28.05.2018 14:46:33 17 NULL - должно быть 2222#
28.05.2018 14:46:34 18 NULL - должно быть 2222#
28.05.2018 14:47:09 19 NULL - должно быть 2222#
28.05.2018 14:47:09 20 NULL - должно быть 2222#
28.05.2018 14:47:09 21 NULL - должно быть 2222#
28.05.2018 14:47:10 22 NULL - должно быть 2222#
28.05.2018 14:48:15 23 NULL - должно быть 2222#
28.05.2018 14:48:32 24 NULL - должно быть 2222#
28.05.2018 14:48:56 25 NULL - должно быть 2222#
28.05.2018 14:48:56 26 NULL - должно быть 2222#
28.05.2018 14:48:56 27 8886
28.05.2018 14:48:57 28 NULL - должно быть 08886
28.05.2018 14:50:10 29 NULL - должно быть 08886
28.05.2018 14:50:10 30 NULL - должно быть 08886
28.05.2018 14:50:27 31 NULL - должно быть 08886
28.05.2018 14:50:38 32 NULL - должно быть 08886
28.05.2018 14:50:38 33 NULL - должно быть 08886
28.05.2018 14:50:38 34 NULL - должно быть 08886
31 май 18, 14:35    [21457670]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
например:
select
isnull(t1.<ваше поле>, t3.[значение на замену])
from
[ваша выборка] t1
cross apply
(
select top 1
t2.[ваше поле] as [значение на замену]
from
[ваша выборка] t2
where
t2.[ваше поле] is not null and
t2.[поле даты] < t1.[поле даты]
order by
t2.[поле даты] desc
) t3
31 май 18, 14:39    [21457703]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36900
select
  a.*
  , isnull ( a.[второе поле], ( select top 1 p.[второе поле] from [а если так] p where p.[первое поле]< a.[первое поле] where p.[второе поле] is not null order by p.[первое поле] desc ) )
from [а если так] a
31 май 18, 14:44    [21457725]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
svanrus
Как ещё можно в ms sql реализовать подобное заполнение (желательно не цикл) ?
логика "протяжки" значений вполне себе успешно реализуется на оконном MAX() OVER(). Осталось только вспомнить - поддерживает ли его MS SQL Server 2005 ?
31 май 18, 18:40    [21458594]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Максимальный - не значит последний:
28.05.2018 14:40:04 1 NULL
28.05.2018 14:40:07 2 NULL
28.05.2018 14:41:04 3 NULL
28.05.2018 14:41:04 4 NULL
28.05.2018 14:41:04 5 NULL
28.05.2018 14:41:05 6 9999#
28.05.2018 14:42:21 7 NULL
28.05.2018 14:42:22 8 NULL
28.05.2018 14:44:32 9 NULL
28.05.2018 14:44:32 10 NULL
28.05.2018 14:45:08 11 NULL
28.05.2018 14:45:09 12 1111#
28.05.2018 14:46:25 13 NULL <— что должно быть здесь 1111# или 9999#?
31 май 18, 20:12    [21458802]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
andrey odegov
Максимальный - не значит последний:
Эта проблема решается довольно просто:
declare @t table (id int identity, v int);

insert into @t
values
 (null), (null), (2), (null), (null), (1), (null), (null);

select
 *,
 cast(substring(max(str(id, 10) + str(v, 10)) over (order by id), 11, 10) as int)
from
 @t
order by
 id;
31 май 18, 22:30    [21459147]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
invm
Эта проблема решается довольно просто
Именно!!!
А впервые этот метод мне лично встретился на оракловой ветке форума ;)
1 июн 18, 04:28    [21459508]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
Щукина Анна,

А, соответственно, про "бабушкин трюк" довелось узнать всё из той же оракловой ветки форума, но немного ранее :)
1 июн 18, 04:38    [21459509]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
Щукина Анна, у Oracle есть LAST_VALUE (FIRST_VALUE) с IGNORE NULLS.
1 июн 18, 14:10    [21461326]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1466
andrey odegov,

во-первых, у Оракла есть не только first_value / last_value с поддержкой ignore nulls, но и LEAD / LAG, как минимум.
во-вторых, по ссылке обсуждается Oracle 8i, в котором уровень развития аналитических функций (в MS их называют - "оконные") хоть и был выше, чем текущая их реализация в MS SQL Server, но кляузы ignore nulls, всё же, ещё не существовала. Она появилась только в версии 10g...
3 июн 18, 19:35    [21464590]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение последующих пустых строк последним заполненным значением  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
в sql тоже уже есть FIRST_VALUE можно дорисовать и с "ignore null"
4 июн 18, 08:49    [21465198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить