मैं एक प्रश्न लिख रहा हूं जो ट्रांजिट स्टेशनों की सूची के साथ कई स्थानों को जोड़ता है, यह सार्वजनिक परिवहन स्टॉप के लिए न्यूनतम दूरी निर्धारित करने का आदेश देता है। क्वेरी के साथ काफी सरल है:

select
  location.id,
  MIN(
    ST_distance_sphere(
      ST_MakePoint(
        transit.latitude,
        transit.longitude
      ),
      ST_MakePoint(
        cast(locations.latitude as double precision),
        cast(locations.longitude as double precision)
      )
    )
  ) as meters_from_nearest_stop,
from public.transit_stops transit
cross join public.locations locations
group by 1

हालाँकि, यह मुझे भोलेपन से न्यूनतम दूरी, केवल न्यूनतम दूरी के साथ स्थान नहीं दे सकता। न्यूनतम दूरी के साथ पंक्ति से अन्य विशेषताओं को वापस करने के लिए मैं इसे कैसे संशोधित कर सकता हूं?

परिणामी क्रॉस जॉइन काफी बड़ा है, इसलिए प्रदर्शन महत्वपूर्ण है।

0
Steven Wright 4 अक्टूबर 2018, 04:57

1 उत्तर

सबसे बढ़िया उत्तर

यह row_number() फ़ंक्शन के साथ इस प्रकार किया जाता है:

select *, 
    row_number() over (partition by location.id order by meters_from_nearest_stop) as closest
from (
    select
      location.id,
      transit.id,
      ST_distance_sphere(
          ST_MakePoint(
            transit.latitude,
            transit.longitude
          ),
          ST_MakePoint(
            cast(locations.latitude as double precision),
            cast(locations.longitude as double precision)
          )
        )
      as meters_from_nearest_stop,
    from public.transit_stops transit
    cross join public.locations locations
) q
where closest=1
0
TomC 4 अक्टूबर 2018, 02:10