It is much better off doing this in datastep and code by @PaigeMiller is much cleaner and I think will be efficient too. But you may able to get the answer by sql with below code. Sorry I just saw that you are running this query in an explicit pass through and sql query I gave will not in explicit pass through as it has sas compoenents in it. Below query should work in explicit pass through.
data abc;
input transaction_id transaction_date:mmddyy10.;
format transaction_date date9.;
datalines;
124 6/14/2017
656 6/14/2017
124 4/17/2017
656 7/23/2016
656 4/17/2016
124 3/15/2016
124 12/20/2014
656 4/16/2014
333 8/5/2013
454 11/5/2012
656 1/20/2011
454 10/22/2010
233 4/30/2010
;
proc sql;
select distinct bde.transaction_id,
first_transaction_date ,
second_transaction_date ,
last_transaction_date
from
(select a.transaction_id, first_transaction_date, last_transaction_date from
(select transaction_id, transaction_date as first_transaction_date from abc
group by transaction_id
having transaction_date = min(transaction_date))a
inner join
(select transaction_id, transaction_date as last_transaction_date from abc
group by transaction_id
having transaction_date = max(transaction_date))b
on a.transaction_id =b.transaction_id)bde
left join
(select a.transaction_id, min(a.transaction_date) as second_transaction_date from
(select transaction_id, transaction_date from
abc)a
inner join
(select transaction_id, min(transaction_date)as min_trasaction_date from abc b
group by transaction_id)b
on a.transaction_id = b.transaction_id
and a.transaction_date > min_trasaction_date)cvcv
on bde.transaction_id =cvcv.transaction_id;
... View more