Использование CTE и двойное использование оконной функции для MAX работает для этого.
И тогда это можно сделать в 1 операторе обновления.
В SQL первый MAX
вычисляет самый высокий предыдущий / текущий Id с допустимым значением column1.
Второй MAX
использует этот вычисленный идентификатор для получения действительного значения column1.
Пример данных:
IF OBJECT_ID('tempdb..#C', 'U') IS NOT NULL DROP TABLE #C;
CREATE TABLE #C (rowid int primary key identity(1,1), column1 VARCHAR(255), RequiredColumn VARCHAR(255));
insert into #C (column1) values
('Wednesday, March 06, 2019 - Weather: TY: 15‹C'),
('a'),
('b'),
('c'),
('Thursday, March 07, 2019 - Weather: TY: 12‹C'),
('d'),
('e'),
('f'),
('Friday, March 08, 2019 - Weather: TY: 12‹C'),
('g'),
('h'),
('i');
Обновить и выбрать
;WITH CTE AS
(
select *,
max(case when rowid = MaxPrevId then column1 end) over (partition by MaxPrevId) as column1calc
from
(
select rowid, column1, RequiredColumn,
max(case
when column1 LIKE '%sunday%'
OR column1 LIKE '%monday%'
OR column1 LIKE '%tuesday%'
OR column1 LIKE '%wednesday%'
OR column1 LIKE '%thursday%'
OR column1 LIKE '%friday%'
OR column1 LIKE '%saturday%'
then rowid
end) over (order by rowid ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as MaxPrevId
from #C
) q
)
UPDATE CTE
SET RequiredColumn = column1calc;
select rowid, RequiredColumn
from #C
order by rowid;
Возвращает:
rowid RequiredColumn
1 Wednesday, March 06, 2019 - Weather: TY: 15‹C
2 Wednesday, March 06, 2019 - Weather: TY: 15‹C
3 Wednesday, March 06, 2019 - Weather: TY: 15‹C
4 Wednesday, March 06, 2019 - Weather: TY: 15‹C
5 Thursday, March 07, 2019 - Weather: TY: 12‹C
6 Thursday, March 07, 2019 - Weather: TY: 12‹C
7 Thursday, March 07, 2019 - Weather: TY: 12‹C
8 Thursday, March 07, 2019 - Weather: TY: 12‹C
9 Friday, March 08, 2019 - Weather: TY: 12‹C
10 Friday, March 08, 2019 - Weather: TY: 12‹C
11 Friday, March 08, 2019 - Weather: TY: 12‹C
12 Friday, March 08, 2019 - Weather: TY: 12‹C