|
Как заполнить пустые ячейки предыдущим значением строки
|
|||
---|---|---|---|
#18+
Всем привет, прошу подсказать как можно заполнить пустые ячейки предыдущим значением строки. Пример прикладываю (первая таблица исходная, вторая как нужно): автор/* 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 15:25 |
|
Как заполнить пустые ячейки предыдущим значением строки
|
|||
---|---|---|---|
#18+
Dolphiin, использовать оконные ф-ии lead/lag ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 15:36 |
|
Как заполнить пустые ячейки предыдущим значением строки
|
|||
---|---|---|---|
#18+
Через оконки и вышло, не актуально. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2021, 15:59 |
|
Как заполнить пустые ячейки предыдущим значением строки
|
|||
---|---|---|---|
#18+
Вчера поспешил с ответом, не верно заполняет, если несколько 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 11:28 |
|
Как заполнить пустые ячейки предыдущим значением строки
|
|||
---|---|---|---|
#18+
Нужен столбец(ы), определяющий порядок строк. Без него можно так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Но корректность результата не гарантируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 11:36 |
|
Как заполнить пустые ячейки предыдущим значением строки
|
|||
---|---|---|---|
#18+
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; ... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 15:59 |
|
Как заполнить пустые ячейки предыдущим значением строки
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.08.2021, 17:38 |
|
|
start [/forum/topic.php?fid=46&tid=1684388]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 140ms |
0 / 0 |