keke: Einträge untereinander vergleichen

Hallo Forum,

Folgene Frage beschäftigt mich jetzt seit einiger Zeit und ich weiss im Moment keinen Ansatz. Vielleicht könnt Ihr mir weiter helfen.
Kurz: Ich möchte aus einer MySQL-Datenbank herauslesen, wieviel Zeit im Schnitt zwischen zwei bestimmten Aktionen vergeht.

Vereinfachter Tabellenaufbau:
time(int),sessionId(int),action(varchar)

123450 1 a
123451 1 a
123452 1 b
123454 1 a
123456 1 b

Wenn immer Aktion "b" in der Tabelle steht, möchte ich die Zeitdifferenz zur Aktion "a" innerhalb derselben Session unmittelbar davor herausbekommen, diese natürlich nur 1mal.
So dass ich einen Durchschnittswert bekomme, wie lange in der Regel aktion "a" läuft, bis "b" eintritt.
Es folgt nicht zwingend auf jedes "a" ein "b", mich interessiert also "a" nur, wenn gleich danach "b" eintritt.

Das Problem ist, ich habe es hier mit mehreren Hundertausend Einträgen zu tun, eine Lösung über Perl/Php o.ä. fällt also aus.

Weiss einer vielleicht einen Tipp, mit welchem Ansatz ich das lösen könnte?

Danke schon mal,
keke

  1. yo,

    Weiss einer vielleicht einen Tipp, mit welchem Ansatz ich das lösen könnte?

    warum du die zeit mit einem integer-datentyp speicherst, erschließt sich mir noch nicht. aber enie lösungsmöglichkeit wäre es, mit korrelierten unterabfragen zu arbeiten. diese gehen bei mysql aber erst ab 4.1+, insofern wäre es hilfreich zu erfahren, welche version dein dbms hat.

    Ilja

    1. Hallo Ilja,
      Danke für Deine Antwort.
      Installiert ist MySQL Version 5.0.45.

      keke

      aber enie lösungsmöglichkeit wäre es, mit korrelierten unterabfragen zu »» arbeiten. diese gehen bei mysql aber erst ab 4.1+, insofern wäre es »» hilfreich zu erfahren, welche version dein dbms hat.

      Ilja

      1. yo,

        ich gehe davon aus, dass vor einem b, immer das passende a kommt und kein anderer wert.

        SELECT t1.time -
               (SELECT MAX(t2.time)
                FROM tabelle t2
                WHERE t2.time < t1.time
               ) Zeitdifferenz
        FROM tabelle t1
        WHERE t1.action = 'b'
        ;

        Ilja

        1. Hallo Ilja,

          genau das wars! Olé Olé

          Tausend Dank :)

          keke

          yo,

          ich gehe davon aus, dass vor einem b, immer das passende a kommt und kein anderer wert.

          SELECT t1.time -
                 (SELECT MAX(t2.time)
                  FROM tabelle t2
                  WHERE t2.time < t1.time
                 ) Zeitdifferenz
          FROM tabelle t1
          WHERE t1.action = 'b'
          ;

          Ilja