Ist es in Ordnung, nach Geometrie zu gruppieren?
Wir zählen viele Punkte anhand von Polygongeometrien, wobei die Daten zuerst geschnitten werden, um Instanzen von Schülern zu zählen. nach Schulgrenze, Blockgruppe usw.:
SELECT
n.nbhd_id
, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)
WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id
Der zweite Schritt ist das Einschließen einer Unterabfrage, um die Geometrie aus der Polygontabelle wieder mit der Zählabfrage zu verknüpfen:
SELECT
count.*
, n.nbhd_name
, n.geom
FROM (
SELECT
n.nbhd_id
, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)
WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id
) AS count
JOIN denver.neighborhoods AS n
ON count.nbhd_id = n.nbhd_id
Sie können Geometrie aber auch in GROUP BY verwenden:
SELECT
n.nbhd_id
, n.nbhd_name
, n.geom
, count(*) AS count_burglaries
FROM denver.crime AS c
JOIN denver.neighborhoods AS n
ON ST_Intersects(c.geom, n.geom)
WHERE c.offense_ty LIKE 'BURG%'
GROUP BY n.nbhd_id, nbhd_name, n.geom
Ist die Einbeziehung von Geometrie in GROUP BY ein korrekter Ansatz?
postgis
grouping
st-geometry
DPSSpatial
quelle
quelle
GROUP BY
dir das? Ist es nicht mit einem eindeutigen Schlüssel von verbindbarnbhd_id
? Sie erweitern die Sortierung, wodurch sich die Laufzeit möglicherweise um mehr als einen nachfolgenden Join erhöht.Antworten:
In diesem Fall ist die Gruppierung nach Geometrie mit ziemlicher Sicherheit kein Problem, da Sie bereits nach einer eindeutigen ID gruppiert sind (
nbhd_id
). Und wie Sie bereits betont haben, erspart es Ihnen einen Join und macht die Abfrage übersichtlicher.Es ist wichtig zu wissen, dass eine
GROUP BY geom
Klausel in PostGIS 2.3 und früheren Versionen Zeilen auf der Grundlage der Begrenzungsrahmengleichheit und nicht der geometrischen Gleichheit gruppiert. Bei realen, nicht erfundenen Daten hat dies häufig den gleichen Effekt wie eine Gruppierung auf geometrische Gleichheit (und ist viel schneller), führt jedoch möglicherweise nicht zu erwarteten Ergebnissen, wenn mehrere unterschiedliche Polygone denselben Begrenzungsrahmen haben. Ab PostGIS 2.4 wirdGROUP BY
eine starre Definition der geometrischen Gleichheit unter Berücksichtigung des Startpunkts und der Ausrichtung von Geometrien verwendet.Da Sie bereits eine Gruppierung
nbhd_id
vornehmen, werden auch dann separate Zeilen angezeigt, wenn zwei unterschiedliche Nachbarschaftspolygone einen Begrenzungsrahmen gemeinsam nutzen.quelle