Нахождение среднего расстояния между координатами - PullRequest
0 голосов
/ 19 марта 2020

У меня есть два набора данных c: 1) поездки на велосипедах и 2) станции, где мне нужно найти станцию ​​с наибольшим средним расстоянием поездки. Я присоединился к таблицам из двух наборов данных

  • bigquery-public-data.london_bicycles.cycle_hire
  • bigquery-public-data.london_bicycles.cycle_stations

Каждая поездка имеет начальную и конечную станции. Поездки обычно имеют конечную станцию, отличную от начальной, поэтому расстояние каждый раз отличается. Хотите выяснить, какая начальная станция имеет в среднем самые длинные поездки / расстояние до своей конечной станции, то есть, какие поездки в среднем относятся к самым дальним конечным станциям для байкеров.

Я бы хотел, чтобы выход 1) был чем-то например:

Trip  Start_station_coordinate  start_st_name  end_station_coordinate  end_st_name   km_dist
 1    POINT(-0.123 51.123)      A-station      POINT(-0.123 51.123)     B-station      ??
 2    POINT(-0.123 51.123)      C-station      POINT(-0.123 51.123)     D-station      ??
 3    POINT(-0.123 51.123)      D-station      POINT(-0.123 51.123)     F-station      ?? 

... и 2) группировать по start_station, которая имеет наибольшее среднее значение km_distance для каждой поездки. Итак, что-то вроде этого:

start_station   average_distance_descending

  A-station     20 km      
  B-station     15 km 
  C-station     3  km

Мой код - JOIN, я не могу включить вышеупомянутое в свой запрос (поскольку я совершенно новичок в sql). Я попробовал следующее с самой проблемной строкой c в самом конце:

 `SELECT ST_GeogPoint(stations1.longitude, stations1.latitude) as WKT1
   ,stations1.id
   ,ST_GeogPoint(stations2.longitude, stations2.latitude) as WKT2
   ,stations2.id as id_2  
   ,trips.end_station_id
   ,trips.start_station_id
   from bigquery-public-data.london_bicycles.cycle_hire as trips
   Inner JOIN bigquery-public-data.london_bicycles.cycle_stations as stations1
   ON trips.start_station_id = stations1.id 
   Inner JOIN bigquery-public-data.london_bicycles.cycle_stations as stations2
   ON trips.end_station_id = stations2.id
   order by AVG(st_distance(WKT1, WKT2))`

BigQuery говорит: " Предложение ORDER BY разрешает агрегирование только в том случае, если агрегация списка GROUP BY или SELECT присутствует в [22: 5] ", со ссылкой на последнюю строку. Я ломал голову над тем, как найти наибольшие средние расстояния (если это вообще возможно) и как объединить их с моей операцией JOIN.

Как мне написать это правильно, чтобы найти правильные расстояния ?? Это чрезвычайно важная задача для меня, и я нахожусь в крайнем сроке без надежды и надежды на помощь как можно скорее

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
WITH output_1 AS (
  SELECT 
    ST_GEOGPOINT(stations1.longitude, stations1.latitude) AS WKT1,
    stations1.name AS start_st_name,
    ST_GEOGPOINT(stations2.longitude, stations2.latitude) AS WKT2,
    stations2.name AS end_st_name,
    ST_DISTANCE(ST_GEOGPOINT(stations1.longitude, stations1.latitude), ST_GEOGPOINT(stations2.longitude, stations2.latitude)) AS dist
  FROM bigquery-public-data.london_bicycles.cycle_hire AS trips
  INNER JOIN bigquery-public-data.london_bicycles.cycle_stations AS stations1
    ON trips.start_station_id = stations1.id 
  INNER JOIN bigquery-public-data.london_bicycles.cycle_stations AS stations2
    ON trips.end_station_id = stations2.id
), output_2 AS (
  SELECT 
    start_st_name AS start_station, 
    ROUND(AVG(dist), 2) AS average_distance
  FROM output_1
  GROUP BY start_st_name
)
SELECT *
FROM output_2
ORDER BY average_distance DESC
LIMIT 10   

с выводом

Row start_station                               average_distance     
1   Blackfriars Station, St. Paul's             5895.44  
2   Bonner Gate, Victoria Park                  4105.8   
3   Walworth Square, Walworth                   3751.54  
4   Bourne Street, Belgravia                    3681.56  
5   Clarence Walk, Stockwell                    3351.18  
6   Clapham Road, Lingham Street, Stockwell     3293.93  
7   Clapham Common North Side, Clapham Common   3268.38  
8   Limburg Road, Clapham Junction              3156.89  
9   Wandsworth Rd, Isley Court, Wandsworth Road 3148.16  
10  Sugden Road, Clapham    3107.68  
0 голосов
/ 19 марта 2020

Я не думаю, что вы хотите "среднее расстояние" между станциями. 2 станции всегда будут иметь одинаковое расстояние между ними.

Давайте сначала создадим таблицу с JOIN из всех возможных комбинаций станций:

CREATE TABLE temp_eu.stations AS (
   SELECT station1, station2
     , ST_DISTANCE(
         ST_GeogPoint(station1.longitude, station1.latitude)
         , ST_GeogPoint(station2.longitude, station2.latitude)) distance
   FROM `bigquery-public-data.london_bicycles.cycle_stations` station1
   JOIN `bigquery-public-data.london_bicycles.cycle_stations` station2
   USING(id)
); 
# 1.4 sec elapsed, 76.1 KB processed

А теперь вы можете дополнить исходную таблицу с этими данными - и сортируйте по расстоянию, если это то, что вы хотите:

SELECT
 distance, station1, station2
 ,hire.duration
 ,hire.bike_id
 ,hire.end_date
 ,hire.end_station_id
 ,hire.end_station_name
 ,hire.start_date
 ,hire.start_station_id
 ,hire.start_station_name
 from `bigquery-public-data.london_bicycles.cycle_hire` as hire
JOIN temp_eu.stations
ON hire.start_station_id = station1.id 
AND hire.end_station_id = station2.id
ORDER BY distance
LIMIT 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...