Подсчет точек / координат, лежащих в ограничивающей рамке - PullRequest
0 голосов
/ 27 октября 2018

У меня есть 2 таблицы. Первая таблица содержит следующие столбцы: Start_latitude, start_longitude, end_latitude, end_longitude, sum. Столбец суммы пуст и должен быть заполнен на основе второй таблицы.

Вторая таблица содержит 3 столбца: point_latitude, point_longitude

Таблица 1

-------------------------
|45 | 50 | 46 | 51 | null|
----|---------------------
|45 | 54 | 46 | 57 | null|
--------------------------

Таблица 2:

---------------
| 45.5 | 55.2 |
---------------
| 45.8 | 50.6 |
---------------
| 45.2 | 56   |
---------------

Нулевые значения в table1-row1 будут равны 1, а в строке 2 - 2. Это количество точек, лежащих в ограничивающей рамке.

Я могу сделать это на python, написав функции для чтения значений между фреймами данных. Как это можно сделать в Postgresql. Это примерное описание проблемы, с которым я столкнулся в своей ситуации.

1 Ответ

0 голосов
/ 28 октября 2018

Обновление Эта версия была протестирована на PostgreSql 9.3 с использованием SQL Fiddle

UPDATE table1 a
SET sum = sub.point_count
FROM (SELECT a.start_lat, a.end_lat, a.start_lon, a.end_lon, COUNT(*) as point_count
      FROM table1 a, table2 b
      WHERE b.point_lat BETWEEN start_lat AND a.end_lat
        AND b.point_lon BETWEEN a.start_lon AND a.end_lon
      GROUP BY a.start_lat, a.end_lat, a.start_lon, a.end_lon) as sub
WHERE a.start_lat = sub.start_lat
  AND a.end_lat = sub.end_lat
  AND a.start_lon = sub.start_lon
  AND a.end_lon = sub.end_lon;

Оригинальный ответ

Вот мое решение, оно протестировано на MySQL, но в этом коде нет ничего конкретного, поэтому оно должно работать и на PostgreSql

UPDATE table1 a,
  (SELECT a.start_lat, a.end_lat, a.start_lon, a.end_lon, COUNT(*) as count
   FROM table1 a, table2 b
   WHERE b.point_lat BETWEEN start_lat AND a.end_lat
   AND b.point_lon BETWEEN a.start_lon AND a.end_lon
   GROUP BY a.start_lat, a.end_lat, a.start_lon, a.end_lon) as sub
SET sum = count
WHERE a.start_lat = sub.start_lat
  AND a.end_lat = sub.end_lat
  AND a.start_lon = sub.start_lon
  AND a.end_lon = sub.end_lon 

Обратите внимание, что этот запрос был бы намного короче, если бы table1 содержал столбец PK Id.

...