2017-04-12 2 views
0

Ich habe eine Tabelle mit Informationen zum Arbeitsstatus eines Benutzers auf einem mobilen Gerät. Jedes Mal, wenn sich ihr Status ändert, wird eine neue Zeile mit ihrem ursprünglichen Status vor der Änderung und ihrem aktuellen Status erstellt. Die Tabelle sieht wie folgt aus:SQL berechnet Zeitdifferenz zwischen zwei Zeilen, die bestimmte Werte enthalten

ID  Date_Time    User  OriginalStatus  NewStatus  
--------------------------------------------------------------------------- 
60713 2017-04-11 12:14:42 Helen  Not Started  Active 
60714 2017-04-11 12:19:20 Monica Active    Paused 
60715 2017-04-11 12:20:43 Dave  Active    Paused 
60716 2017-04-11 12:32:18 Helen  Finished   Archived 
60717 2017-04-11 12:48:57 Monica Paused    Active 
60718 2017-04-11 12:52:35 Dave  Paused    Active 

Was ich versuche, die Dauer zu tun ist, zu berechnen, die jeder Benutzer bleibt im Status ‚Angehalten‘ an jedem Tag ... sie sind wieder nur erlaubt, sich von ‚Angehalten‘ auf "Aktiv", was das Ende ihrer "Pausiert" -Zeit anzeigt, und alle anderen Zeilen können ignoriert werden, und die Änderungen von "Pausiert" zurück zu "Aktiv" werden nicht in aufeinanderfolgenden Zeilen sein.

Im obigen Beispiel ist Monica für 29 Minuten und 37 Sekunden (12:19:20 bis 12:48:57) "Paused" geblieben und Dave ist 31 Minuten und 52 Sekunden "Paused" (12: 20:43 bis 12:52:35).

Im Idealfall würde ich gerne Ergebnisse ähnlich wie:

User  Paused_Start_Time  Paused_End_Time  Paused_Duration 
--------------------------------------------------------------------------- 
Monica 2017-04-11 12:19:20 2017-04-11 12:48:57 00:29:37 
Dave  2017-04-11 12:20:43 2017-04-11 12:52:35 00:31:52 

ich ratlos bin, wie diese geht über die Arbeit aus, so dass alle dankbar empfangen helfen. Ich bin mit SQL Server 2012.

+0

Speziell für SQL-Fragen ist es besser zu erwähnen DBMS-Version, die Sie verwenden. – niksofteng

Antwort

1

Ich glaube, Sie nur lead() brauchen:

select user, date_time as paused_starttime, next_date_time as paused_endtime 
from (select t.*, 
      lead(date_time) over (partition by user order by date_time) as next_date_time 
     from t 
    ) t 
where status = 'paused'; 

Um die Dauer erhalten Sie die Werte subtrahieren können. Dies gibt jedoch das Intervall als Datetime Wert zurück. Sie können dies in eine time konvertieren, aber die Zeit wird nie größer als 24 Stunden sein. Ich bin mir nicht sicher, was Sie tun möchten, wenn die Zeit diesen Zeitraum überschreitet.

+0

Ich wusste das nicht. Vielen Dank. Es ist ab 2012. – niksofteng

+0

Hallo, Entschuldigung für die Verzögerung bei der Antwort ... –

+0

Hallo, Entschuldigung für die Verzögerung bei der Antwort ... LEAD() würde funktionieren, aber leider gibt es oft zusätzliche Zeilen zwischen dem Status 'Pausiert' und dem 'Aktiv' Status. Was ich brauche, ist, dass nach einer Instanz von 'Pausiert' die nächste Zeile für diesen Benutzer relevant ist, wobei 'Aktiv' als 'Pausenzeit' identifiziert wird und es ist dieser Teil, den ich nicht herausfinden kann, da diese Zeile mehrere oder viele sein kann Reihen weiter unten. –

Verwandte Themen