Windowed function LAG
should give you the answer - :
https://msdn.microsoft.com/enLAG (Transact-us/library/hh231256.aspxSQL).
This function allows it so you don't have to join to get [current]-nth value
SELECT
*,
LAG([ENTRY_DATE], 1, NULL) OVER (
OVER ( PARTITION BY [ID], [STATE], [ENTRY_DATE]
ORDER BY [ENTRY_DATE]) AS EXIT_DATE
FROM table;