Объединение таблиц на основе геометрии и ближайшей отметки времени BigQuery SQl - PullRequest
0 голосов
/ 19 июня 2020

У меня две таблицы; df1 содержит Date1 (метка времени) и PolygonWKT (геометрия), df2 содержит Date2 (метка времени) и PointWKT (геометрия). Я присоединился к df1 и df2 на основе геометрии, поэтому каждый PointWKT попадал под соответствующий PolygonWKT. Проблема в том, что столбцы Date1 и Date2e перепутаны, и мне также нужно сопоставить Date1 и Date2. Я хотел бы объединить таблицы на основе геометрии , а также ближайшего совпадения отметок времени между Date1 и Date2.

 df2
 | PointWKT  |      Date2            |     
 --------------------------------------
 |    b    | 2020-05-05 12:00:00 UTC |
 |    b    | 2020-05-05 12:00:10 UTC |
 |    b    | 2020-05-05 12:00:20 UTC |
 |    b    | 2020-05-05 12:17:00 UTC |
 |    c    | 2020-05-06 18:00:00 UTC |


df1
 | PolygonWKT  |      Date1          |
--------------------------------------
 |    A    | 2020-05-03 9:00:00 UTC  |
 |    A    | 2020-05-03 9:30:10 UTC  |
 |    B    | 2020-05-05 12:05:00 UTC |
 |    B    | 2020-05-05 12:25:00 UTC |
 |    C    | 2020-05-06 18:05:00 UTC |

Первая часть кода правильная, но вторая часть не возвращает то, что я хочу:

    SELECT *
    FROM `xxx.yyy.df1` as df1 ,
    `xxx.yyy.df2` as df2
    WHERE ST_Contains (df1.PolygonWKT, df2.PointWKT) 


    AND ( 
    df2.Date2 BETWEEN df1.Date1 AND TIMESTAMP_ADD(df1.Date1, INTERVAL 10 MINUTE)



    
desired df

| PointWKT  |      Date2            || PolygonWKT  |      Date1          |     
----------------------------------------------------------------------------
 |    b    | 2020-05-05 12:00:00 UTC | |    B    | 2020-05-05 12:05:00 UTC |
 |    b    | 2020-05-05 12:00:10 UTC | |    B    | 2020-05-05 12:05:00 UTC |
 |    b    | 2020-05-05 12:00:20 UTC | |    B    | 2020-05-05 12:05:00 UTC |
 |    b    | 2020-05-05 12:17:00 UTC | |    B    | 2020-05-05 12:25:00 UTC |
 |    c    | 2020-05-06 18:00:00 UTC | |    C    | 2020-05-06 18:05:00 UTC |

Как правильно это сделать?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Я хотел бы объединить таблицы на основе геометрии , а также ближайшего совпадения отметок времени между Date1 и Date2 .

Ниже для BigQuery Стандартный SQL

SELECT  
  ARRAY_AGG(STRUCT(df2.PointWKT, df2.Date2, df1.PolygonWKT, df1.Date1) 
    ORDER BY ABS(TIMESTAMP_DIFF(df2.Date2, df1.Date1, SECOND)) 
    LIMIT 1)[OFFSET(0)].*
FROM `xxx.yyy.df1` AS df1 ,
  `xxx.yyy.df2` AS df2
WHERE ST_CONTAINS(df1.PolygonWKT, df2.PointWKT) 
GROUP BY TO_JSON_STRING(STRUCT(df2.PointWKT, df2.Date2))

Если применить к образцу данных, аналогичному приведенному в вашем примере -

WITH `xxx.yyy.df1` AS (
  SELECT ST_GEOGPOINT(1,2) PolygonWKT, TIMESTAMP '2020-05-03 9:00:00 UTC' Date1 UNION ALL
  SELECT ST_GEOGPOINT(1,2), '2020-05-03 9:30:10 UTC' UNION ALL
  SELECT ST_GEOGPOINT(1,3), '2020-05-05 12:05:00 UTC' UNION ALL
  SELECT ST_GEOGPOINT(1,3), '2020-05-05 12:25:00 UTC' UNION ALL
  SELECT ST_GEOGPOINT(1,4), '2020-05-06 18:05:00 UTC' 
), `xxx.yyy.df2` AS (
  SELECT ST_GEOGPOINT(1,3) PointWKT, TIMESTAMP '2020-05-05 12:00:00 UTC' Date2 UNION ALL
  SELECT ST_GEOGPOINT(1,3), '2020-05-05 12:00:10 UTC' UNION ALL
  SELECT ST_GEOGPOINT(1,3), '2020-05-05 12:00:20 UTC' UNION ALL
  SELECT ST_GEOGPOINT(1,3), '2020-05-05 12:17:00 UTC' UNION ALL /* this value adjusted based on exapected result sample - as it looks as a typo */
  SELECT ST_GEOGPOINT(1,4), '2020-05-06 18:00:00 UTC' 
)

, вывод будет

Row PointWKT    Date2                   PolygonWKT  Date1    
1   POINT(1 3)  2020-05-05 12:00:00 UTC POINT(1 3)  2020-05-05 12:05:00 UTC  
2   POINT(1 3)  2020-05-05 12:00:10 UTC POINT(1 3)  2020-05-05 12:05:00 UTC  
3   POINT(1 3)  2020-05-05 12:00:20 UTC POINT(1 3)  2020-05-05 12:05:00 UTC  
4   POINT(1 3)  2020-05-05 12:17:00 UTC POINT(1 3)  2020-05-05 12:25:00 UTC  
5   POINT(1 4)  2020-05-06 18:00:00 UTC POINT(1 4)  2020-05-06 18:05:00 UTC 
0 голосов
/ 19 июня 2020

Судя по вашим выборочным данным, вы выбираете даты в неправильном порядке. Это делает то, что вы хотите?

df2.Date1 BETWEEN df2.Date1 AND TIMESTAMP_ADD(df2.Date1, INTERVAL 10 MINUTE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...