There are two ways to achieve this scenario.
1. Inner Query
select dba.disp_ship.ds_id, dba.disp_ship.ds_bill_charge, 
        dba.disp_ship.ds_status, dba.disp_ship.ds_ship_type, 
        dba.disp_events.de_site, dba.disp_events.de_arrdate, 
        dba.disp_events.de_shipment_id, dba.disp_events.de_ship_seq
from dba.disp_ship
    inner join dba.disp_events on dba.disp_ship.ds_id = dba.disp_events.de_shipment_id,
inner Join (Select a.de_shipment_id as shipid,max(a.de_arrdate) as arrdate 
            from disp_events a) as t on dba.disp_events.de_shipment_id = t.shipid and dba.disp_events.de_arrdate = t.arrdate
2. Procedure
//Datatype for the Temporary tables is an assumption. Replace with your data type.
begin
declare local temporary table tbl1(
   ds_id numeric(10),
   ds_bill_charge numeric(14,2), 
   ds_status int,
   ds_ship_type int, 
   de_site char(20),
   de_arrdate date, 
   de_shipment_id numeric(10),
   de_ship_seq numeric(10)
)on commit preserve rows;
declare local temporary table tbl1(
    rowid numeric(10);
    shipmentid numeric(10)
)on commit preserve rows;
declare @rowcount,@ds_id,i numeric(10);
set i = 1;
insert into tbl1
select dba.disp_ship.ds_id, dba.disp_ship.ds_bill_charge, 
        dba.disp_ship.ds_status, dba.disp_ship.ds_ship_type, 
        dba.disp_events.de_site, dba.disp_events.de_arrdate, 
        dba.disp_events.de_shipment_id, dba.disp_events.de_ship_seq
from dba.disp_ship
    inner join dba.disp_events on dba.disp_ship.ds_id = dba.disp_events.de_shipment_id;
insert into tbl2
select number(*), ds_id from(select distinct ds_id from tbl1) a;
select count(*) into @rowcount from tbl2;
while i <= @rowcount Loop
   Select ds_id into @ds_id from tbl2 where rowid = i;
   delete from tbl1 where ds_id = @ds_id and 
                de_ship_seq not in(select top 1 de_ship_seq from tbl1 a
                                   where a.ds_id = @ds_id order by de_arrdate desc);
   i++;
end Loop;
select * from tbl1;
end
Thank You...