Alternative method for those without LEAD() and LAG()
WITH cteSAMPLEDATA
AS (--Create Sample data
SELECT ID, ORDER_ID, CODE, ORDER_DATE FROM
(VALUES
(1, 'ORDER1', 'DS', N'20151001'),
(2, 'ORDER2', 'DS', N'20151001'),
(5, 'ORDER2', 'DS', N'20151002'),
(3, 'ORDER3', 'DS', N'20151001'),
(6, 'ORDER3', 'AG', N'20151002'),
(8, 'ORDER3', 'AG', N'20151003'),
(4, 'ORDER4', 'DS', N'20151001'),
(7, 'ORDER4', 'AG', N'20151002'),
(9, 'ORDER4', 'DS', N'20151003')
)
AS MYTABLE(ID, ORDER_ID, CODE, ORDER_DATE)
)
SELECT A.ID
,A.ORDER_ID
,A.CODE
,A.ORDER_DATEAS ORDER_DATE
,B.IDAS PREVIOUS_ID
,B.CODEAS PREVIOUS_CODE
,B.ORDER_DATEAS PREVIOUS_ORDERDATE
FROM (
SELECT DISTINCT X.*
FROM cteSAMPLEDATA C
CROSS APPLY(
SELECT TOP 1 *
FROM cteSAMPLEDATA Z
WHERE Z.ORDER_ID = C.ORDER_ID
ORDER BY Z.ORDER_DATE DESC
) X
) A
CROSS APPLY(
SELECT TOP 1 *
FROM cteSAMPLEDATA Z
WHERE Z.ORDER_ID = A.ORDER_ID
AND Z.ORDER_DATE<A.ORDER_DATE
ORDER BY Z.ORDER_DATE DESC
) B
WHERE A.CODE<>B.CODE