Aggregation von Daten auf unterschiedlichen Rasterebenen

Kürzlich habe ich mit den „Regionalstatistische Rastereinheiten“ der Statistik Austria gearbeitet[1]. Wir haben mit den Ebenen 250, 500 und 1000 Metern gearbeitet. Und mit diesen Daten musste ein Datensatz verschnitten werden, der personenbezogene Daten beinhaltet hat. Wenn die Anzahl der Personen unter einer bestimmten Größe (<5) auf unterster Ebene (250 Meter) lag, dann mussten man es auf die nächste höhere Ebene (500 Meter) legen und überprüfen, ob dort die Kriterien zutrafen. Falls nicht, dann auf den 1000 Meter Raster. Jetzt lagen sowohl die Daten, als auch die Rasterdaten in einer Postgres-Datenbank vor. Also was liegt dann näher als sich diese Dinge auch in der Datenbank berechnen zu lassen.

Der Einfachheit nehmen wir folgende Tabelle her:

Jetzt noch ein paar Testdaten:

Für die Berechnung selbst, habe ich der Einfachheit halber jeweils einen Hash verwendet, der alle relevanten Spalten umfasst. Jetzt legen wir für jede Ebene noch einen Hash an:

Jetzt müssen wir noch überlegen, wie wir die Daten aggregieren müssen. Die Idee ist, dass man auf der untersten Eben (250 Meter) anfängt zu überprüfen, welche Daten unter der minimalen Anzahl an Personen (5) liegt. Danach die diese Daten auf der Ebene 500 Meter überprüft und gegebenenfalls dann auf die höchsten Ebene (1000 Meter) legt. Danach muss man auf der 500 Meter Ebene überprüfen, welche der möglichen Daten, nicht auf die 1000 Meter Ebene gehoben wurden und am Ende noch auf dem 250 Meter Raster überprüfen, welche Daten noch übrig sind. Das ganze wird in einer SQL-Abfrage mit mehreren CTEs[2] überprüft. Der erste Teil holt sich alle Daten, die auf der 250er Ebene die Kriterien nicht erfüllen:

Die nächste CTE aggregiert dann die Daten für die 500er-Ebene

Im nächsten Schritt werden die Datensätze ermittelt, die auch auf der 500er Ebene zu wenig Personen haben

Diese Daten werden dann auf der 1000er Ebene aggregiert

Und im nächsten Schritt geht es wieder auf die 500er Ebene um die Daten für diese Ebene zu ermitteln. Dafür müssen wir alle potenziellen Datensätze eliminieren, die schon auf der 1000er Ebene in Verwendung sind

Und danach können wir alle Datensätze für die 500er-Ebene ermitteln

Im letzten Schritt ermitteln wir noch alle Datensätze für den 250 Meter Raster

Und zum Abschluss das komplette Statement:

Jetzt könnte man beispielsweise noch einen View anlegen, der die einzelnen Zeilen über den Hash wieder mit den „Roh-Daten“ verknüpft und so die einzelnen Merkmale wieder abrufen kann.

[1] http://data.statistik.gv.at/web/meta.jsp?dataset=OGDEXT_RASTER_1

[2] https://www.postgresql.org/docs/current/static/queries-with.html

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.