From: | Jean-Luc Lachance <jllachan(at)nsd(dot)ca> |
---|---|
To: | |
Cc: | "Thomas T(dot) Thai" <tom(at)minnesota(dot)com>, PostgreSQL General <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: calculating spherical distance in sql |
Date: | 2002-02-18 16:30:33 |
Message-ID: | 3C712C29.9D3E2D20@nsd.ca |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
If for each query, you are going to compute a cartesian product every
time,
why not compute it once and for all... trade speed for space.
Find what will be the greatest distance ever queried
(let's try to limit the size of the resulting table).
CREATE TABLE zip_dist AS
(SELECT z.zip_code as from_zip, s.to_zip as to_zip
3958.75 * acos(
sin(s.latitude/57.2958) *
sin(z.latitude/57.2958) +
cos(s.latitude/57.2958) *
cos(z.latitude/57.2958) *
cos(z.longitude/57.2958 - s.longitude/57.2958)
) AS dist
FROM zipcodes AS z, zipcodes AS s
) AS ss
WHERE dist < {MAX_DIST_EVER};
If you want more speed, you can even create an index.
CREATE index zip_dist_from on zip_dist( from_zip, dist);
Then
SELECT to_zip, dist from zip_dist where from_zip = '55401' and dist <
20;
jll
Tom Lane wrote:
>
> Doug McNaught <doug(at)wireboard(dot)com> writes:
> > Define "didn't work".
>
> "Didn't work" no doubt means "a column name defined in the SELECT's
> output list is not available in the SELECT's where clause".
>
> The way you could actually suppress multiple calculations of an
> expression is to use a sub-SELECT:
>
> SELECT *
> FROM
> (SELECT z.zip_code,z.poname,z.state,
> (3958.75 *
> acos(
> sin(s.latitude/57.2958) *
> sin(z.latitude/57.2958) +
> cos(s.latitude/57.2958) *
> cos(z.latitude/57.2958) *
> cos(z.longitude/57.2958 - s.longitude/57.2958)
> )
> ) AS dist
> FROM zipcodes AS z, zipcodes AS s
> WHERE s.zip_code='55401'
> ) AS ss
> WHERE dist < 20
> ORDER BY dist LIMIT 10;
>
> I'm not convinced that it buys much in this example, but with a
> *seriously* expensive expression to calculate, it might be worth
> contorting your query like this...
>
> regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo(at)postgresql(dot)org
From | Date | Subject | |
---|---|---|---|
Next Message | Rich Shepard | 2002-02-18 16:33:44 | libpq or ecpg? |
Previous Message | Gurunandan R. Bhat | 2002-02-18 16:29:08 | Time difference changed in 7.2 |