powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заполнить Null значениями из пред. строки
5 сообщений из 5, страница 1 из 1
Заполнить Null значениями из пред. строки
    #40102016
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет, прошу подсказать как можно исправить код, чтобы верно заполнялись пустые значения значениями из пред. строки.

Пример данных и вторая таблица до какого решения дошел:

авторDECLARE @Customers TABLE
(Id varchar(10),
Date date,
Terminal_Id integer,
LastTimeUpdate datetime)

INSERT INTO @Customers
VALUES ('20100101-1', '20100101', NULL, NULL),
('20100101-2', '20100101', NULL, NULL),
('20100102-1', '20100102', 1, '2010-01-02 00:28:19.000'),
('20100102-2', '20100102', NULL, NULL),
('20100103-1', '20100103', 1, '2010-01-03 00:22:19.000'),
('20100103-2', '20100103', NULL, NULL),
('20100104-1', '20100104', NULL, NULL),
('20100104-2', '20100104', 2, '2010-01-04 00:29:19.000'),
('20100105-1', '20100105', 1, '2010-01-05 00:26:19.000'),
('20100105-2', '20100105', Null, NULL)

Select *
From @Customers
Order by Id

/*Запрос*/
Select Id, Date,
first_value(Terminal_Id) over (partition by grp order by date) as Terminal_Id,
first_value(LastTimeUpdate) over (partition by grp order by date) as LastTimeUpdate
from (
Select *,
sum(case when Terminal_Id is not null then 1 end) over (order by id) as grp
From @Customers
) t

Как хочу, чтобы было:

автор/* Final */
DECLARE @Final TABLE
(Id varchar(10),
Date date,
Terminal_Id integer,
LastTimeUpdate datetime)

INSERT INTO @Final
VALUES ('20100101-1', '20100101', NULL, NULL),
('20100101-2', '20100101', NULL, NULL),
('20100102-1', '20100102', 1, '2010-01-02 00:28:19.000'),
('20100102-2', '20100102', NULL, NULL),
('20100103-1', '20100103', 1, '2010-01-03 00:22:19.000'),
('20100103-2', '20100103', NULL, NULL),
('20100104-1', '20100104', 1, '2010-01-03 00:22:19.000'),
('20100104-2', '20100104', 2, '2010-01-04 00:29:19.000'),
('20100105-1', '20100105', 1, '2010-01-05 00:26:19.000'),
('20100105-2', '20100105', 2, '2010-01-04 00:29:19.000')

Select *
From @Final
...
Рейтинг: 0 / 0
Заполнить Null значениями из пред. строки
    #40102031
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dolphiin,

организуйте цикл при помощи курсора, вычисляйте и обновляйте.
...
Рейтинг: 0 / 0
Заполнить Null значениями из пред. строки
    #40102097
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Если не составит особого труда можете по приведенному примеру написать, как можно с помощью курсора это реализовать?
Сам про него только слышал, ни разу не использовал и мне конечно быстрее получится понять его работу на уже готовом примере.
...
Рейтинг: 0 / 0
Заполнить Null значениями из пред. строки
    #40102101
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dolphiin,

курсор выбирает одну строку за каждый цикл итерации из результата запроса, который указан в выражении курсора.
Производите необходимые вычисления и обновляете текущую строку.

https://www.yandex.ru/search/?lr=39&offline_search=1&text=sql server cursor example
...
Рейтинг: 0 / 0
Заполнить Null значениями из пред. строки
    #40102118
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dolphiin,

В качестве примера (до нужного вида допилите самостоятельно)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as
(
 Select c.*,
 a.s,
 max(a.s + convert(varchar(30), c.LastTimeUpdate, 126)) over (order by a.s rows between unbounded preceding and 1 preceding) as v
 From @Customers c cross apply
 (select right(replicate(' ', 10) + substring(c.id, 10, 1000), 10) + left(id, 8)) a (s)
)
select
 Id, Date, Terminal_Id, s,
 isnull(LastTimeUpdate, cast(substring(v, 19, 1000) as datetime))
from
 t
Order by Id
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заполнить Null значениями из пред. строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]