Bademeister: MYSQL: Berechnung über zwei Datensätze

Beitrag lesen

Hi Michael,
es dürfte gehen, wenn man denn will (aber ich halte es für nicht unbedingt empfehlenswert), in dem man die Tabelle mit sich selbst verknüpft und entsprechend gruppiert:

Ich gehe mal der Einfachheit halber davon aus, dass Datum eine Ganzzahl, etwa ein Unix-Timestamp, ist - ggf. musst Du das entsprechend anpassen.

Dann wäre das (ungetestete) Beispiel

SELECT
     T1.Datum,
     min(if(T2.Datum - T1.Datum >= 0, T2.Datum - T1.Datum, 2147483647))
FROM
     Datumstabelle T1, Datumstabelle T2
GROUP BY
     T1.Datum
ORDER BY
     T1.Datum ASC;

Ich hab einfach mal aufsteigend sortiert, geht nicht genau aus dem Posting hervor. Wenn außerdem das Datum in der Tabelle nicht UNIQUE ist, müsstest du stattdessen nach dem Primary Key o.ä. gruppieren, um nichts zu verlieren.

Die hässliche lange Zahl da wäre eine obere Schranke, die verhindert, dass negative Werte bei den Vergleichen das Minimum kaputt machen - soll ja nur mit den späteren Zeiten verglichen werden (die Zahl da ist das Maximum eines 32-Bit-Unix-Timestamps, hab ich gerade bei Wikipedia gelernt).

Das Ganze besticht aber erstens nicht durch Eleganz, wie ich finde, und zweitens ist es (wahrscheinlich) deutlich komplexer als Deine Version. Jenseits des Sortierens der Daten, das Du ja so oder so machst, ist die Komplexität für die Berechnung aller Abstände hier quadratisch in der Anzahl der Daten, weil das vor dem Sortieren passiert.

(Es sei denn, das DBMS hat eine sehr schlaue innere Optimierung, die die jeweiligen Minima anhand EINER vorsortierten Liste berechnet. Davon hab ich leider nicht viel Ahnung, aber mein Gefühl sagt mir, dass das zuviel verlangt ist.)

Das Berechnen der Abstände in PHP, wie Du es machst, geht natürlich in linearer Zeit. Ich weiß nicht, um wie viele Datensätze es geht, aber prinzipiell würde ich wohl am ehesten einfach dabei bleiben, es in PHP zu machen ;-)

Viele Grüße,
der Bademeister