Sql-und-Xml - Home

SQL-Praxis

X-Y - Daten zu einem Sprungdiagramm ergänzen - ein kleines Beispiel für angewandtes SQL

Ihnen liegen Daten in Form von X-Y-Werten vor. Die X-Werte sind sortiert, es handelt sich bsp. um eine Zeitachse oder um die Häufigkeitsverteilung von Werten zwischen 0 und 100. Sie benötigen ein Sprungdiagramm, so daß nicht die einzelnen Punkte angezeigt und durch Verbindungen extrapoliert werden, sondern daß eine auf- und absteigende Treppe erzeugt wird.

Beispiel: Ihre bisheriges Ergebnis erzeugt das folgende Diagramm:

Original-Diagramm mit normaler Extrapolation - ohne Treppenpunkte
XY
12
24
37
45

Als Ergebnis wünschen Sie jedoch

Sprungdiagramm - Originaldaten ergänzt um die Treppenpunkte
XY
12
22
24
34
37
47
45
Wie Sie der Datenreihe entnehmen können, gelingt dies, indem neue X/Y-Kombinationen eingefügt werden. Es wird zu einem Punkt A(x1, y1) der Punkt B(x2, y2) mit dem nächstgrößeren X-Wert gesucht und ein neuer Punkt C(x2, y1) eingefügt, der als X-Wert den Wert des zweiten Punktes, als Y-Wert den Wert des ersten Punktes erhält. Die Punkte müssen dann der Reihe nach so gezeichnet werden, daß der eingefügte Punkt immer zwischen den Originalpunkten gezeichnet wird.

Lösung für das Sprungdiagramm

Sie können dieses Problem folgendermaßen lösen. Die Daten erstellen Sie direkt in einer Sql-fähigen Datenbank oder importieren sie von der Originalstelle in eine Datenbank. Die Tabelle mag Rohdaten, die beiden Spalten mögen X und Y heißen. Nun erstellen Sie eine Sql-Abfrage mit dem folgenden Code:
SELECT 	B.X AS X_New,
	A.Y AS A_New,
	1 AS OrderCol

FROM Rohdaten As A INNER JOIN Rohdaten AS B
ON A.X < B.X
WHERE B.X = (SELECT MIN(C.X) FROM Rohdaten AS C WHERE C.X > A.X)

UNION

SELECT A.X, A.Y, 2
FROM Rohdaten AS A

ORDER BY X_New, OrderCol

Erklärung zum Sql-Code

Die erste Select-Anweisung bildet eine Selbstverknüpfung der Tabelle 'Rohdaten' mit sich selbst, wobei zu jeder Zeile von A alle Zeilen mit hinzugenommen werden, bei denen der X-Wert größer ist. Aus dieser Menge werden jene Zeilen ausgewählt, bei welchen der größere X-Wert gleich dem Minimum all dieser größeren X-Werte ist - dies ist genau die X-Koordinate des nächsten Punktes. Von diesen Tupeln wird die X-Koordinate des zweiten und die Y-Koordinate des ersten Wertes genommen und um einen Wert 1 in der Spalte OrderCol ergänzt. Dieser vermerkt, daß es sich um einen berechneten Wert handelt.

Die zweite Abfrage sammelt einfach die Originaldaten, ergänzt um einen Spaltenwert 2. Damit wird angezeigt, daß es sich um die Originaldaten handelt.

Beide Ergebnisse werden mittels des UNION - Operators miteinander verknüpft und zunächst nach den X-Koordinaten sortiert. Bei den gleichen X-Werten wäre es jedoch zufällig, ob die Reihenfolge korrekt ist. Deshalb wird über die nur wegen diesem Sortierungsproblem eingefügten Spalte OrderCol zusätzlich sortiert, so daß die berechneten Werte bei gleicher X-Koordinate zuerst erscheinen.

© 2003-2016 Jürgen Auer, Berlin.