Distance entre le début et date de fin de BigQuery

0

La question

Dans BigQuery, je suis en train d'écrire une requête qui calcule la distance entre le début et date de fin pour chaque ID. Je ne suis pas intéressé dans les points entre les plages de dates. J'ai seulement besoin de saisir les coordonnées lat/long de début et une date de fin et de calculer la distance euclidienne.

Tableau 1 ressemble à ceci:

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

Le tableau 2 présente les coordonnées et ressemble à ceci:

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

Mes résultats souhaités ressemblerait à:

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

C'est aussi proche que j'ai reçu, mais depuis il peut y avoir plusieurs ID, c'est de ne pas faire correspondre les bons de début et dates de fin pour chaque 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

Les résultats actuels ressembler à:

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

La meilleure réponse

2

Si cela peut résoudre votre problème:

J'utilise t1 en tant que source et JOIN t2 à deux reprises sur les dates (début et fin), puis ceux de la référence ST_DISTANCE. Il y a peut-être un plus rapide/mai performantes moyen de résoudre ce problème.

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

Résultats:

Ligne ID date_debut start_long start_lat end_date end_long end_lat distance
1 Un 2016-9-16 -109.33 40.76 2016-10-9 -109.33 40.75 1111.9510117740244
2 Un 2017-3-18 -109.33 40.81 2017-4-9 -109.32 40.96 16700.437093959285
2021-11-24 01:32:33

Dans d'autres langues

Cette page est dans d'autres langues

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