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

Пример прикладываю (первая таблица исходная, вторая как нужно):

автор/* Test Data & Table */
DECLARE @Customers TABLE
(Date date,
Terminal_Id integer,
LastTimeUpdate datetime)

INSERT INTO @Customers
VALUES ('20100101', NULL, NULL),
('20100102', NULL, NULL),
('20100103', 1, '2010-01-03 00:28:19.000'),
('20100104', NULL, NULL),
('20100105', NULL, NULL),
('20100106', 1, '2010-01-06 00:24:19.000'),
('20100107', Null, NULL),
('20100103', 2, '2010-01-03 00:22:19.000'),
('20100104', Null, NULL)

Select *
From @Customers

/* Final */
DECLARE @Final TABLE
(Date date,
Terminal_Id integer,
LastTimeUpdate datetime)

INSERT INTO @Final
VALUES ('20100101', NULL, NULL),
('20100102', NULL, NULL),
('20100103', 1, '2010-01-03 00:28:19.000'),
('20100104', 1, '2010-01-03 00:28:19.000'),
('20100105', 1, '2010-01-03 00:28:19.000'),
('20100106', 1, '2010-01-06 00:24:19.000'),
('20100107', 1, '2010-01-06 00:24:19.000'),
('20100103', 2, '2010-01-03 00:22:19.000'),
('20100104', 2, '2010-01-03 00:22:19.000')

Select *
From @Final

Васин Дмитрий
BI Analyst
Направление продуктового анализа Fortis
Группа компаний МОНОПОЛИЯ
monopoly.ru
...
Рейтинг: 0 / 0
Как заполнить пустые ячейки предыдущим значением строки
    #40091883
mnbvcx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dolphiin, использовать оконные ф-ии lead/lag
...
Рейтинг: 0 / 0
Как заполнить пустые ячейки предыдущим значением строки
    #40091903
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через оконки и вышло, не актуально. Спасибо
...
Рейтинг: 0 / 0
Как заполнить пустые ячейки предыдущим значением строки
    #40092173
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вчера поспешил с ответом, не верно заполняет, если несколько Terminal_Id.
Прошу подсказать, кто знает, как сделать.

Пробовал так:

автор;with temp as (
Select
Date,
Terminal_Id,
LastTimeUpdate,
sum(case when Terminal_Id is not null then 1 end) over (order by date) as grp_terminal_id
From @Customers
)
Select
Date,
Terminal_id,
LastTimeUpdate,
first_value(Terminal_id) over (partition by grp_terminal_id order by date) as Terminal_Id2,
first_value(LastTimeUpdate) over (partition by grp_terminal_id order by date) as LastTimeUpdate2
From temp
...
Рейтинг: 0 / 0
Как заполнить пустые ячейки предыдущим значением строки
    #40092178
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужен столбец(ы), определяющий порядок строк.
Без него можно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with c as
(
 select
  Date, Terminal_Id, LastTimeUpdate,
  row_number() over (order by 1/0) as rn
 from
  @Customers
)
select
 c.Date,
 isnull(c.Terminal_Id, substring(max(a.v1) over (order by rn rows between unbounded preceding and 1 preceding), 11, 1000000)),
 isnull(c.LastTimeUpdate, substring(max(a.v2) over (order by rn rows between unbounded preceding and 1 preceding), 11, 1000000))
from
 c cross apply
 (
  select
   str(rn, 10) + str(c.Terminal_Id, 10),
   str(rn, 10) + convert(varchar(30), c.LastTimeUpdate, 126)
 ) a (v1, v2)
order by
 rn;

Но корректность результата не гарантируется.
...
Рейтинг: 0 / 0
Как заполнить пустые ячейки предыдущим значением строки
    #40092286
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm

На указанном мной примере работает, спасибо.
Только ещё один вопрос - на реальных данных даты по терминалам у меня перечислены только по столбцу LastTimeUpdate, т.е. не полностью сквозная нумерация, а только по последней дате обновления. Чтобы все даты появились, джойнил календарь отдельно к таблице, но тогда указанный запрос не корректно работает. Может, кто сможет ещё подсказать.

Пример прикладываю, нужно чтобы в конце у Terminal_Id = 2 была ещё строка

2010-01-04 2 2010-01-03 00:22:19.000

автор/* Test Data & Table */
DECLARE @Customers TABLE
(Date date,
Terminal_Id integer,
LastTimeUpdate datetime)

INSERT INTO @Customers
VALUES ('20100101', NULL, NULL),
('20100102', NULL, NULL),
('20100103', 1, '2010-01-03 00:28:19.000'),
('20100104', NULL, NULL),
('20100105', NULL, NULL),
('20100106', 1, '2010-01-06 00:24:19.000'),
('20100107', Null, NULL),
('20100103', 2, '2010-01-03 00:22:19.000'),
('20100105', 2, '2010-01-05 00:23:19.000')

Select *
From @Customers

;with c as
(
select
Date, Terminal_Id, LastTimeUpdate,
row_number() over (order by 1/0) as rn
from
@Customers
)
select
c.Date,
isnull(c.Terminal_Id, substring(max(a.v1) over (order by rn rows between unbounded preceding and 1 preceding), 11, 1000000)),
isnull(c.LastTimeUpdate, substring(max(a.v2) over (order by rn rows between unbounded preceding and 1 preceding), 11, 1000000))
from
c cross apply
(
select
str(rn, 10) + str(c.Terminal_Id, 10),
str(rn, 10) + convert(varchar(30), c.LastTimeUpdate, 126)
) a (v1, v2)
order by
rn;
...
Рейтинг: 0 / 0
Как заполнить пустые ячейки предыдущим значением строки
    #40092323
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dolphiin,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
with c as
(
 select
  Date, Terminal_Id, LastTimeUpdate,
  row_number() over (order by 1/0) as rn
 from
  @Customers
),
t1 (Date, TerminalId, LastTimeUpdate) as
(
 select
  c.Date,
  isnull(c.Terminal_Id, substring(max(a.v1) over (order by rn rows between unbounded preceding and 1 preceding), 11, 10000)),
  isnull(c.LastTimeUpdate, substring(max(a.v2) over (order by rn rows between unbounded preceding and 1 preceding), 11, 10000))
 from
  c cross apply
  (
   select
    str(rn, 10) + str(c.Terminal_Id, 10),
    str(rn, 10) + convert(varchar(30), c.LastTimeUpdate, 126)
  ) a (v1, v2)
),
t2 (Date, TerminalId, LastTimeUpdate, Date__next) as
(
 select
  Date, TerminalId, LastTimeUpdate,
  lead(Date, 1, dateadd(day, 1, Date)) over (partition by TerminalId order by Date) as Date__next
 from
  t1
)
select
 b.Date, b.TerminalId, b.LastTimeUpdate
from
 t2 t cross apply
 (
  select top (datediff(day, t.Date, t.Date__next))
   dateadd(day, row_number() over (order by 1/0) - 1, t.Date),
   t.TerminalId,
   t.LastTimeUpdate
  from
   master.dbo.spt_values
 ) b (Date, TerminalId, LastTimeUpdate)
order by
 t.TerminalId, b.Date;
...
Рейтинг: 0 / 0
Как заполнить пустые ячейки предыдущим значением строки
    #40092350
Dolphiin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm

Теперь все отлично работает, благодарю. Осталось разобраться только как)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заполнить пустые ячейки предыдущим значением строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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