2017-02-06 9 views
6

BigQueryでHAVERSINE()を取得する方法を探しています。たとえば、最も近い気象観測所を任意の地点に取得する方法は?BigQueryのHAVERSINE距離?

+0

参照:標準SQLでhttps://twitter.com/joaocorreia/status/827638555035840512 –

答えて

6

あなたはロジックをカプセル化するためにSQL関数を定義することができますstandard SQLを使用します。例えば、

#standardSQL 
CREATE TEMP FUNCTION RADIANS(x FLOAT64) AS (
    ACOS(-1) * x/180 
); 
CREATE TEMP FUNCTION RADIANS_TO_KM(x FLOAT64) AS (
    111.045 * 180 * x/ACOS(-1) 
); 
CREATE TEMP FUNCTION HAVERSINE(lat1 FLOAT64, long1 FLOAT64, 
           lat2 FLOAT64, long2 FLOAT64) AS (
    RADIANS_TO_KM(
    ACOS(COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * 
     COS(RADIANS(long1) - RADIANS(long2)) + 
     SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)))) 
); 

SELECT 
    lat, 
    lon, 
    name, 
    HAVERSINE(40.73943, -73.99585, lat, lon) AS distance_in_km 
FROM `bigquery-public-data.noaa_gsod.stations` 
WHERE lat IS NOT NULL AND lon IS NOT NULL 
ORDER BY distance_in_km 
LIMIT 4; 
2

レガシーSQL溶液(標準申請中):(http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/に基づく)

SELECT lat, lon, name, 
    (111.045 * DEGREES(ACOS(COS(RADIANS(40.73943)) * COS(RADIANS(lat)) * COS(RADIANS(-73.99585) - RADIANS(lon)) + SIN(RADIANS(40.73943)) * SIN(RADIANS(lat))))) AS distance 
FROM [bigquery-public-data:noaa_gsod.stations] 
HAVING distance>0 
ORDER BY distance 
LIMIT 4 

enter image description here

+0

するのではなく、クエリの体内に直接それを置くために持つよりも、SQL UDFのロジックを置くことができます。 –

+0

私は知っている!私はすぐに試しましたが、DEGREES()とRADIANS()が欠けていました。 PI()の不足を含む同等の変換を把握するまで、クエリを保留にしておきます。しかし、私は戻ってくるよ:) –

+0

ところで - これはkm単位の距離を与える –