if your x and y fields are indexed you could try using non standard joins. It would be something like this
Code:
SELECT GeoID, R1 AS Ring1, R2-R1 AS Ring2, R3-R2 AS Ring3
FROM
(SELECT q0.GeoID,
Sum(q1.Food) AS R1,
Sum(q2.Food) AS R2,
Sum(q3.Food) AS R3,
FROM ((Datafile_worldmap AS q0
INNER JOIN Datafile_worldmap AS q1 ON q1.x>=g0.x-1 and q1.x<=g0.x+1 and q1.y>=g0.y-1 and q1.y>=g0.y+1)
INNER JOIN Datafile_worldmap AS q2 ON q2.x>=g0.x-2 and q2.x<=g0.x+2 and q2.y>=g0.y-2 and q2.y>=g0.y+2)
INNER JOIN Datafile_worldmap AS q3 ON q3.x>=g0.x-3 and q3.x<=g0.x+3 and q3.y>=g0.y-3 and q3.y>=g0.y+3
GROUP BY q0.GeoID)
You do have a lot of data, so will still take some time, but should be faster than subqueries. By way of illustration, a client had a complex subquery which was taking around 18 hours to run. When I applied the non standard join (and tidied up a few other bits), it took about an hour. Think they had about 1m records to process - so perhaps 8 hours for yours, but just a guess, no promises
Non standard joins cannot be used in the query builder- but you can create the basic query using the builder then go into sql view and change the joins from = to >= and <= as required.
Assuming your x and y's are doubles, something else that might improve performance is to change x and y to long's - multiply by a suitable factor so you don't lose granularity. Doubles use 8 bytes, longs 4 - so simplistically, longs will be twice as fast as doubles.