Vzdialenosť medzi počiatočný a koncový dátum BigQuery

0

Otázka

V BigQuery, snažím sa napísať dotaz, ktorý vypočíta vzdialenosť medzi počiatočný a koncový dátum pre každú ID. Nie som záujem o body medzi tých dátumov. Len som musieť chytiť lat/long začatia a dátum ukončenia a vypočítať euklidovej vzdialenosti.

Tabuľka 1 vyzerá takto:

    ID     startdate     enddate
    A      2016-9-16     2016-10-9
    A      2017-3-18     2017-4-9

Tabuľka 2 má súradnice a vyzerá takto:

ID  Date        Latitude      Longitude
A   2016-9-16   40.76        -109.33
A   2016-9-17   40.72        -109.33
A   2016-10-9   40.75        -109.33
A   2017-3-18   40.81        -109.33
A   2017-4-8    40.83        -109.33
A   2017-4-9    40.96        -109.32

Môj požadované výsledky by vyzerať takto:

ID t1.startdate   t2.Latitude t2.Longitude t1.enddate t2.Latitude t2.Longitude  distance
A   2017-3-18    40.81       -109.33      2017-4-9    40.96       -109.32      150
A   2016-9-16    40.76       -109.33      2016-10-9   40.75      -109.33       200

Je to tak blízko, ako som sa dostal ale pretože môže existovať viacero ID', to nie je zhodné správne dátumy začatia a ukončenia pre každého ID:

SELECT
t1,t2, 
ST_DISTANCE(Point1, Point2 ) as distance
from (
SELECT
    ID, 
      st_geogpoint(Longitude,Latitude) as Point1
      from `t2` AS t2 INNER JOIN  
      `t1` AS t1 ON t1.ID = t2.ID
        WHERE  t1.ID = t2.ID AND
        t2.Date = t1.startdate ) t1,
          (
   SELECT 
        ID, 
        st_geogpoint(Longitude, Latitude) as Point2
        from `t2` AS t2 INNER JOIN  
       `t1` AS t1 ON t1.ID = t2.ID
        WHERE  t1.ID = t2.ID AND
        t2.Date = t1.enddate
    ) t2
WHERE  t1.ID = t2.ID

Aktuálne výsledky vyzerať takto:

ID t1.startdate   t2.Latitude t2.Longitude t1.enddate t2.Latitude t2.Longitude  distance
A   2016-9-16    40.76       -109.33      2016-10-9    40.75       -109.33      150
A   2016-9-16    40.76       -109.33      2017-4-9     40.96      -109.32       250
A   2017-3-18    40.81       -109.33      2017-4-9     40.96      -109.32       200
A   2017-3-18    40.81       -109.33      2016-10-9    40.75      -109.33       250
google-bigquery sql
2021-11-23 19:03:52
1

Najlepšiu odpoveď

2

Takže to môže vyriešiť váš problém:

Používam t1 ako zdroj a JOIN t2 dvakrát na dátumy (štart & koniec) potom odkaz tých, v ST_DISTANCE. Tam možno rýchlejší/môže výkonný spôsob, ako to vyriešiť.

WITH t1 as (
        SELECT 'A' AS ID, '2016-9-16'AS startdate, '2016-10-9' AS enddate
        UNION ALL SELECT 'A','2017-3-18', '2017-4-9'
), t2 as (
SELECT 'A' AS ID,'2016-9-16' AS date, 40.76 AS Latitude, -109.33 AS Longitude    
UNION ALL SELECT 'A','2016-9-17',40.72,-109.33 
UNION ALL SELECT 'A','2016-10-9',40.75,-109.33
UNION ALL SELECT 'A','2017-3-18',40.81,-109.33
UNION ALL SELECT 'A','2017-4-8',40.83,-109.33
UNION ALL SELECT 'A','2017-4-9',40.96,-109.32
)

SELECT
  t1.ID, 
  start_point.date AS start_date,
  start_point.Longitude AS start_long,
  start_point.Latitude AS start_lat,
  end_point.date AS end_date,
  end_point.Longitude AS end_long,
  end_point.Latitude AS end_lat,
  ST_DISTANCE(
    ST_GEOGPOINT(start_point.Longitude,start_point.Latitude), 
    ST_GEOGPOINT(end_point.Longitude,end_point.Latitude)) AS distance

FROM t1 
JOIN t2 AS start_point
ON t1.id = start_point.id AND t1.startdate = start_point.date

JOIN t2 AS end_point
ON t1.id = end_point.id AND t1.enddate = end_point.date

Výsledky:

Riadok ID start_date start_long start_lat end_date end_long end_lat vzdialenosť
1 A 2016-9-16 -109.33 40.76 2016-10-9 -109.33 40.75 1111.9510117740244
2 A 2017-3-18 -109.33 40.81 2017-4-9 -109.32 40.96 16700.437093959285
2021-11-24 01:32:33

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................