Разделение значений даты и времени делает это трудным (как и тот факт, что время было отформатировано), но это должно делать то, что вы хотите.
Сначала создайте тестовые данные:
CREATE TABLE #tmp (ID int, DataDate date, DataHour int, Value decimal(9,1), UpdateDate date, UpdateTime Time(3))
INSERT INTO #tmp Values
(23,'09/03/2019', 11, 65.2,'09/15/2019', '04:15:20.9'),
(16 ,'09/03/2019', 11 ,66.7 ,'09/15/2019', '04:15:20.9'),
(26 ,'09/03/2019', 11 ,62.3 ,'09/15/2019', '04:15:20.9'),
(27 ,'09/03/2019', 11 ,69.8 ,'09/15/2019', '04:15:20.9'),
(15 ,'09/03/2019', 11 ,59.2 ,'09/15/2019', '04:15:20.9'),
(22 ,'09/02/2019', 11 ,45.2 ,'09/15/2019', '04:15:20.9'),
(41 ,'09/02/2019', 11 ,36.7 ,'09/15/2019', '04:15:20.9'),
(25 ,'09/02/2019', 11 ,62.3 ,'09/15/2019', '04:15:20.9'),
(21 ,'09/02/2019', 11 ,79.8 ,'09/15/2019', '04:15:20.9'),
(12 ,'09/02/2019', 11 ,19.2 ,'09/15/2019', '04:15:20.9'),
(17 ,'09/02/2019', 11 ,19.2 ,'09/15/2019', '04:15:20.9')
Тогда вот код, который сгенерирует желаемый результат.Измените это и вставьте его в операторы UPDATE по мере необходимости:
;WITH Base as (
SELECT
DataDate,
DataHour,
Max(UpdateDate) as BaseDate,
Max(UpdateTime) as BaseTime
FROM #tmp t2
GROUP BY DataDate,
DataHour
),
AdjData as (
SELECT
ID,
t.DataDate,
t.DataHour,
t.Value,
Cast(BaseDate as Datetime) + Cast(BaseTime as DateTime) as BaseDateTime
,row_number() over (Partition by t.DataDate, t.DataHour ORDER BY t.Id Desc) as Adj
FROM #tmp t
INNER JOIN Base b
ON t.DataDate = b.DataDate
AND t.DataHour = b.DataHour
)
SELECT Id,
DataDate,
DataHour,
Value,
Cast(Dateadd(hour, -(Adj-1), BaseDateTime) AS date) as UpdateDate,
Cast(Dateadd(hour, -(Adj-1), BaseDateTime) AS Time(3)) as UpdateTime
FROM AdjData