it-swarm.com.de

Auswahl "aufeinanderfolgender" Zeilen mit denselben Werten

Ich habe eine Tabelle mit folgenden Daten:

userID  tStamp                status
------  -------------------   ------
Jason   2017-10-18 03:20:00   idle  
Brown   2017-10-18 03:20:28   idle  
Brown   2017-10-18 03:25:28   idle  
Brown   2017-10-18 04:00:28   active    
Brown   2017-10-18 04:10:28   active    
Brown   2017-10-18 04:35:28   idle  
Brown   2017-10-18 04:45:28   idle  

Ich möchte die aufeinanderfolgenden Zeilen mit demselben Status extrahieren. Zum Beispiel möchte ich die Zeit sehen, die ein Benutzer im 'Leerlauf' Status verbringt, gefolgt von 'aktiv' Status, gefolgt von 'idle' status und so weiter.

Wie mache ich das in einer einzelnen SQL-Abfrage?

Meine gewünschte Ausgabe ist die folgende:

userID        staus          Duration_in_this_status (min)
------  -------------------   ------
Jason         idle             ---  
Brown         idle              5
Brown         active           10   
Brown         idle             10   
6
user3719749
SELECT userID, status, TIMESTAMPDIFF(minute, MIN(tStamp), MAX(tStamp)) AS duration
FROM (
    SELECT
    t.*
    , @groupNumber := IF(@prev_userID != userID OR @prev_status != status, @groupNumber + 1, @groupNumber) AS gn
    , @prev_userID := userID
    , @prev_status := status
    FROM t
    , (SELECT @groupNumber := 0, @prev_userID := NULL, @prev_status := NULL) var_init_subquery
    ORDER BY userID, tStamp
) sq
GROUP BY gn, userID, status

So funktioniert das. Wir definieren drei Variablen. Eine mit einer Gruppennummer und zwei mit den Werten der vorherigen Zeilenwerte von Status und Benutzer-ID. Beachten Sie, dass es in einer relationalen Datenbank keine Reihenfolge gibt, es sei denn, Sie geben sie an. Dies ist sehr wichtig. In der select-Klausel prüfen wir zunächst, ob sich die Variablenwerte von der aktuellen Zeile unterscheiden. Wenn ja, erhöhen wir die Gruppennummer, wenn nicht, lassen wir sie unverändert. Danach weisen wir die Werte der aktuellen Zeile zu. Wenn die Variablen bei der Verarbeitung der nächsten Zeile ausgewertet werden, enthalten sie weiterhin die Werte der vorherigen Zeile. Die Reihenfolge ist also auch hier wichtig. In der äußeren Abfrage können wir einfach nach dieser Gruppennummer gruppieren, um die Min- und Max-Werte des Zeitstempels zu erhalten.

  • lesen Sie mehr über benutzerdefinierte Variablen hier
3
tombom