查找两个表之间最近的地理点bigquery

rur96b6h  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(382)

我有两张有经纬度的table。我想创建一个新表,其中包含两个表的信息,基于查找表之间的最近点。这类似于之前提出的问题;但是其中一个表有数组。前面问题的解决方案似乎不适用于数组。
表a

  1. |--------|-------------|-------------|-------------|
  2. | id | latitude | longitude | address |
  3. |--------|-------------|-------------|-------------|
  4. | 1 | 39.79 | 86.03 | 123 Vine St |
  5. |--------|-------------|-------------|-------------|
  6. | 2 | 39.89 | 84.01 | 123 Oak St |
  7. |--------|-------------|-------------|-------------|

表b

  1. |-------------|-------------|-------------|--------------|
  2. | latitude | longitude | parameter1 | parameter2 |
  3. |-------------|-------------|-------------|--------------|
  4. | 39.74 | 86.33 | [1, 2, 3] | [.1, .2, .3] |
  5. |-------------|-------------|-------------|--------------|
  6. | 39.81 | 83.90 | [4, 5, 6] | [.4, .5, .6] |
  7. |-------------|-------------|-------------|--------------|

我想创建一个新表,表c,它包含表a中的所有行,并添加表b中的信息。表b中的信息是基于表b中最接近表a中特定行的点添加的。
表c

  1. |------|-------------|-------------|--------------|
  2. | id_A | address | parameter1 | parameter2 |
  3. |------|-------------|-------------|--------------|
  4. | 1 | 123 Vine St | [1, 2, 3] | [.1, .2, .3] |
  5. |------|-------------|-------------|--------------|
  6. | 2 | 123 Oak St | [4, 5, 6] | [.4, .5, .6] |
  7. |------|-------------|-------------|--------------|

提前谢谢!

jhdbpxl9

jhdbpxl91#

下面是bigquery标准sql

  1. # standardSQL
  2. SELECT AS VALUE
  3. ARRAY_AGG(STRUCT(id, address, parameter1, parameter2) ORDER BY ST_DISTANCE(a.point, b.point) LIMIT 1)[OFFSET(0)]
  4. FROM (SELECT *, ST_GEOGPOINT(longitude, latitude) point FROM `project.dataset.tableA`) a,
  5. (SELECT *, ST_GEOGPOINT(longitude, latitude) point FROM `project.dataset.tableB`) b
  6. GROUP BY id

如果要应用于您问题中的样本数据

  1. WITH `project.dataset.tableA` AS (
  2. SELECT 1 id, 39.79 latitude, 86.03 longitude, '123 Vine St' address UNION ALL
  3. SELECT 2, 39.89, 84.01, '123 Oak St'
  4. ), `project.dataset.tableB` AS (
  5. SELECT 39.74 latitude, 86.33 longitude, [1, 2, 3] parameter1, [.1, .2, .3] parameter2 UNION ALL
  6. SELECT 39.81, 83.90, [4, 5, 6], [.4, .5, .6]
  7. )

输出为

展开查看全部

相关问题