Hi @Analyst_SQL Try this:
;WITH CTE1 AS
(
SELECT T.*,M.Holiday
,LAG(Duty)OVER(PARTITION BY EnrollNumber ORDER BY T.Date) AS Previous_Duty
,LEAD(Duty)OVER(PARTITION BY EnrollNumber ORDER BY T.Date) AS Next_Duty
FROM #tbl_Emp_Register T LEFT JOIN #MonthDate M ON T.Date=M.Date
),CTE2 AS
(
SELECT EnrollNumbeR,[Date],[Day],TimeIN,TimeOut,Duty
,CASE WHEN Holiday='H' AND Previous_Duty IS NULL AND Next_Duty IS NULL THEN 2
WHEN Holiday='H' AND (Previous_Duty = 1 OR Next_Duty = 1) THEN 1
END AS New_Duty
FROM CTE1
),CTE3 AS
(
SELECT EnrollNumbeR,[Date],[Day],TimeIN,TimeOut,Duty
,CASE WHEN Duty IS NULL AND LAG(New_Duty)OVER(PARTITION BY EnrollNumber ORDER BY Date)=2 THEN 2
WHEN Duty IS NULL AND LEAD(New_Duty)OVER(PARTITION BY EnrollNumber ORDER BY Date)=2 THEN 2
ELSE New_Duty END AS New_Duty
FROM CTE2
)
UPDATE CTE3
SET Duty=New_Duty WHERE New_Duty IS NOT NULL
Best regards,
Cosmog Hong