You didn't give table or field names, sooooo..
I created a table "CAMPAIGN" (I really hate shouting) with the headings from the table above in proper case.
I created Query2 to get the max dates by site.
Code:
SELECT Campaign.Site, Max(Campaign.BookingEndDate) AS MaxOfBookingEndDate
FROM Campaign
GROUP BY Campaign.Site;
Then I created another query (Query4) adding Query2 and table "Campaign"
Code:
SELECT Campaign.Site, Campaign.bookingStateDate, Campaign.BookingEndDate, Campaign.CampaignID, Campaign.CampaignName
FROM Query2 INNER JOIN Campaign ON (Query2.Site = Campaign.Site) AND (Query2.MaxOfBookingEndDate = Campaign.BookingEndDate);
This is only one method..
Of course it would be easier if the table was normalized...