Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как заполнить пустые ячейки предыдущим значением строки / 8 сообщений из 8, страница 1 из 1
19.08.2021, 15:25
    #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
19.08.2021, 15:36
    #40091883
mnbvcx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заполнить пустые ячейки предыдущим значением строки
Dolphiin, использовать оконные ф-ии lead/lag
...
Рейтинг: 0 / 0
19.08.2021, 15:59
    #40091903
Dolphiin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заполнить пустые ячейки предыдущим значением строки
Через оконки и вышло, не актуально. Спасибо
...
Рейтинг: 0 / 0
20.08.2021, 11:28
    #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
20.08.2021, 11:36
    #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
20.08.2021, 15:59
    #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
20.08.2021, 17:38
    #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
20.08.2021, 19:20
    #40092350
Dolphiin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заполнить пустые ячейки предыдущим значением строки
invm

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


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