0

私は2つのテーブルを持っています。最初のテーブルには次の列が含まれています: Start_latitude、start_longitude、end_latitude、end_longitude、sum。合計列は空で、2 番目のテーブルに基づいて入力する必要があります。

2 番目のテーブルには、point_latitude、point_longitude の 3 つの列が含まれています。

表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 の null 値は 1 ですが、row2 では 2 になります。これは、境界ボックス内にあるポイントの数です。

データフレーム間の値を読み取る関数を書くことで、Pythonでそれを行うことができます。Postgresqlでこれを行うにはどうすればよいですか。これは、私の状況で思いついたサンプルの問題ステートメントです。

4

1 に答える 1

2

更新 このバージョンは、SQL Fiddle を使用して PostgreSql 9.3 でテストされました

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 列が含まれている場合、このクエリははるかに短くなることに注意してください。

于 2018-10-28T20:49:50.127 に答える