You don't need to check the ID in the case statement as that is guaranteed by the join but it doesn't hurt.
If you want to do an update from this then it is better to put the check in the join rather than the case statement otherwise you will be updating a lot of rows unnecessarily.
set flag = 1
from tbl t1
join tbl t2
on t1.ID = t2.ID
and t1.Discharge = t2.Admit
and t1.flag = 0
It depends a bit on how you want to use this and your distribution of data..
It could be better to maintain a separate table with the removed rows or maybe an indexed view to materialise it.
If you are holding the changed data you only need to run the update on entries that have been changed - maybe have a filter based on the last time the update was run and the rows that have been added since then.