So if I could then just take the first result for each employee I'd be fine. However I've tried (and failed) to do SQL including things like DISTINCT, first() and GROUP BY, but don't seem to be able to get anywhere.
I probably just can't see the easy obvious answer, so any help would be very much appreciated.
Try this: make a Select totals query displaying the employeeID and Max(DateFrom). Save it, say as qryAddrSub. In the next query, display the EmployeeID, PostCode, and DateFrom from the original table, include the query qryAddrSub as another recordset in the query, and Inner Join the two Employee ID fields together, and also the main table's DateFrom and the query's MaxDateFrom together. That should give you what you need.
There are other ways to skin the cat; this is the way I'd do it.