Подсчет точек / координат, лежащих в ограничивающей рамке

У меня 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, а в row2 - 2. Это количество точек, лежащих в пределах ограничивающей рамки.

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

В ваших таблицах нет столбцов с идентификаторами?

Joakim Danielson 28.10.2018 21:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлять Эта версия была протестирована на 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.

Другие вопросы по теме