Looks OK to me.
If there are indexes on the table I might duplicate the where clause internally so I'm not selecting the max(rowid) from the entire table but it should work without it.
delete from tab1 where rowid not in (
select max(rowid) from tab1
where clientid=2 and clientname='b' and prospectcaseid=2
group by clientid, prospectcaseid,clientname
)
and clientid=2
and clientname='b'
and prospectcaseid=2 ;