You could try something like this.
But the result return, an extra record from the expected, but I am assuming it may have been missed from the list.
declare @f table (fbalance decimal(10,2), fdate datetime, facno varchar(50));
insert into @f values (10000.00, '21 dec 2013', '010001801000007');
insert into @f values (15000.00, '21 jan 2014', '010001801000007');
insert into @f values (20000.00, '15 jan 2014', '010001801000007');
insert into @f values (29550.00, '21 jan 2014', '010001801000007');
insert into @f values (34550.00, '21 feb 2014', '010001801000007');
insert into @f values (4000.00, '21 dec 2013', '010001801000008');
insert into @f values (8000.00, '21 dec 2013', '010001801000008');
insert into @f values (12000.00, '21 jan 2014', '010001801000008');
insert into @f values (16000.00, '21 feb 2014', '010001801000008');
insert into @f values (50000.00, '22 nov 2012', '010001801000009');
insert into @f values (100000.00, '22 dec 2012', '010001801000009');
insert into @f values (70000.00, '22 jan 2014', '010001801000010');
insert into @f values (80000.00, '22 feb 2014', '010001801000010');
insert into @f values (1000.00, '23 nov 2013', '010001801000012');
insert into @f values (1500.00, '23 dec 2013', '010001801000012');
insert into @f values (2000.00, '23 jan 2014', '010001801000012');
insert into @f values (2500.00, '23 feb 2014', '010001801000012');
insert into @f values (3000.00, '23 mar 2014', '010001801000012');
insert into @f values (3500.00, '23 apr 2014', '010001801000012');
insert into @f values (500.00, '23 jan 2014', '010001801000013');
select
f.*
from @f f
inner join (
select facno, max(fdate) fdateMax
from @f
group by facno
) fMaxDt
on
f.facno = fMaxDt.facno
and
f.fdate = fMaxDt.fdateMax
order by 3
;
fbalance fdate facno
34550.00 2014-02-21 010001801000007
16000.00 2014-02-21 010001801000008
100000.00 2012-12-22 010001801000009
80000.00 2014-02-22 010001801000010
3500.00 2014-04-23 010001801000012
500.00 2014-01-23 010001801000013