Ciao robgiov.
Ho visto questo tuo post e mi è sembrato interessante.
Provo a darti un'idea di soluzione con l'avvertenza, però, che l'esito finale dipende un po' anche dalla logica che interconnette tra di loro i dati e sulla quale non ci hai detto molto.
Anzitutto, cosa buona e giusta sarebbe quella di fornire un po' di codice per poter di replicare l'ambiente operativo.
Facendo un po' di Cut & Past e qualche sforbiciata ai dati che hai fornito, ecco una struttura spero idonea su cui fare qualche esercizio.
declare @TAB as table
(
ID int
, JH_BATCH_ID varchar(50)
, JH_PROC_ID varchar(50)
, BATCH_DataIni datetime
, BATCH_DataEnd datetime
, BATCH_TrainID char(2)
)
insert into @TAB(ID, JH_BATCH_ID, JH_PROC_ID, BATCH_DataIni, BATCH_DataEnd, BATCH_TrainID) values
(18635, 'RI22AA250', 'SCONGELO', '20220511 15:57:27', '20220511 21:51:16', 'P2')
,(18646, 'RI22AA250', 'SCONGELO', '20220511 15:57:28', '20220511 21:51:17', 'P2')
,(18647, 'RI22AA250', 'SCONGELO', '20220511 15:57:29', '20220511 21:51:18', 'P2')
,(18648, 'RI22AA250', 'SCONGELO', '20220511 15:57:30', '20220511 21:51:19', 'P2')
,(18665, 'P2_110522_2217', 'LAVAGGIO', '20220511 22:17:16', '20220512 00:02:18', 'P2')
,(18666, 'P2_110522_2217', 'LAVAGGIO', '20220511 22:17:16', '20220512 00:02:18', 'P2')
, (18667, 'P2_110522_2217', 'LAVAGGIO', '20220511 22:17:16', '20220512 00:02:18', 'P2')
,(18699, 'RI22AA251', 'SCONGELO', '20220512 02:35:18', '20220512 08:28:47', 'P2')
,(18700, 'RI22AA251', 'SCONGELO', '20220512 02:35:19', '20220512 08:28:48', 'P2')
,(18701, 'RI22AA251', 'SCONGELO', '20220512 02:35:20', '20220512 08:28:49', 'P2')
,(18709, 'RI22AA251', 'SCONGELO', '20220512 02:35:21', '20220512 08:28:50', 'P2')
,(18713, 'P2_110522_1003', 'LAVAGGIO', '20220511 10:03:26', '20220511 12:10:23', 'P2')
,(18714, 'P2_110522_1003', 'LAVAGGIO', '20220511 10:03:26', '20220511 12:10:23', 'P2')
Mi sono preso un po' la libertà di aggiungere qualche record e di apportare qualche lieve modifica ai dati per essere certo di ottenere quello che hai chiesto.
Creata la tabella, ho scritto due CTE che provvedono alla creazione di un modello per l'aggiornamento secondo le specifiche che hai dato.
La prima CTE è propedeutica alla seconda per ragioni tecniche dal momento che non è possibile utilizzare i valori di ROW_NUMBER prima ancora che vengano generati.
La seconda CTE fornisce il dataset delle righe da aggiornate con precalcolati gli ID da cui derivare i valori origine.
Il resto lo fa la struttura di Update.
Con i dati da te forniti il risultato che ho ottenuto mi pare coerente.
E' un tentativo...spero sia utile.
Ecco il codice:
-- Prima dell'aggiornamento
select *from @TAB order by ID
-- Aggiornamento in corso...
;with cte as
(
select
(
case
when JH_PROC_ID = 'SCONGELO' then row_number() over (partition by JH_BATCH_ID order by ID desc)
when JH_PROC_ID = 'LAVAGGIO' then row_number() over (partition BY JH_BATCH_ID order by ID)
else null
end
) as RowNumber
, *
from @TAB
)
,cte_Update as
(
select
(case when JH_PROC_ID = 'LAVAGGIO' then lag(id, RowNumber) over (order by ID) else null end) as Update_ID
, *
from CTE
)
update t set
JH_BATCH_ID = t1.JH_BATCH_ID
, BATCH_DataIni = t1.BATCH_DataIni
, BATCH_DataEnd = t1.BATCH_DataEnd
from @tab t
inner join cte_Update u on u.Update_ID is not null and t.ID = u.ID
inner join @TAB t1 on t1.ID = u.Update_ID
-- Dopo l'aggiornamento
select * from @TAB