2016-04-19 7 views
1

ich eine Liste der Momente ein bestimmter Benutzer etwas auf einer bestimmten Workstation hat:Finden Zeitraum in der Liste der Statusänderungen (pro Status)

station timestamp 
    TC61879 2016-03-25 09:34:40.000 
    TC61879 2016-03-25 09:38:36.000 
    TC61879 2016-03-25 10:01:17.000 
    TC61879 2016-03-25 10:02:10.000 
    TC61879 2016-03-25 10:04:01.000 
    TC61879 2016-03-25 10:04:43.000 
    TC61879 2016-03-25 10:05:49.000 
    TC61879 2016-03-25 10:06:00.000 
    TC61878 2016-03-25 10:08:05.000* 
    TC61879 2016-03-25 10:09:41.000 
    TC61879 2016-03-25 10:10:40.000 
    TC61879 2016-03-25 10:35:50.000 
    TC61879 2016-03-25 10:37:57.000 
    TC61879 2016-03-25 10:38:21.000 
    TC61879 2016-03-25 10:39:34.000 
    TC61879 2016-03-25 10:40:59.000 
    TC61879 2016-03-25 10:41:20.000 
    TC61879 2016-03-25 10:42:21.000 
    TC61879 2016-03-25 10:44:05.000 
    TC61879 2016-03-25 10:44:17.000 
    TC61879 2016-03-25 10:46:25.000 
    TC61879 2016-03-25 10:47:48.000 
    TC61879 2016-03-25 10:49:03.000 
    TC61879 2016-03-25 10:51:31.000 
    TC61879 2016-03-25 10:51:58.000 
    TC61875 2016-03-25 10:52:42.000* 
    TC61875 2016-03-25 10:53:49.000* 
    TC61879 2016-03-25 10:53:57.000 
    TC61879 2016-03-25 11:36:58.000 
    TC61879 2016-03-25 11:37:37.000 
    TC61879 2016-03-25 11:38:45.000 
    TC61879 2016-03-25 11:40:08.000 
    TC61879 2016-03-25 11:41:46.000 
    TC61879 2016-03-25 11:43:43.000 
    TC61879 2016-03-25 11:44:49.000 
    TC61879 2016-03-25 11:46:06.000 
    TC61879 2016-03-25 11:48:17.000 
    TC61879 2016-03-25 11:50:22.000 
    TC61879 2016-03-25 11:52:06.000 
    TC61879 2016-03-25 11:52:22.000 
    TC61879 2016-03-25 11:53:07.000 
    TC61879 2016-03-25 11:55:29.000 
    TC61879 2016-03-25 11:55:49.000 
    TC61879 2016-03-25 11:56:24.000 
    TC61879 2016-03-25 11:57:20.000 
    TC61879 2016-03-25 11:57:55.000 
    TC61879 2016-03-25 11:58:15.000 
    TC61879 2016-03-25 11:59:05.000 
    TC61879 2016-03-25 11:59:17.000 
    TC61878 2016-03-25 11:59:52.000* 
    TC61879 2016-03-25 12:00:08.000 
    TC61879 2016-03-25 12:01:04.000 
    TC61879 2016-03-25 12:01:36.000 
    TC61878 2016-03-25 12:04:42.000* 
    TC61879 2016-03-25 12:04:46.000 
    TC61879 2016-03-25 12:05:37.000 
    TC61878 2016-03-25 12:07:37.000* 
    TC61879 2016-03-25 12:07:47.000 
    TC61879 2016-03-25 12:08:36.000 
    TC61879 2016-03-25 12:10:16.000 
    TC61879 2016-03-25 12:11:30.000 

Asterisk ist, wenn ein Benutzer etwas auf einer anderen Workstation hat als sein Standardwert. Was ist notwendig ist, eine Liste der von-bis pro Arbeitsplatz, wie folgt aus:

Station  From      To 
TC61879  2016-03-25 09:34:40.000 2016-03-25 10:08:05.000 
TC61878  2016-03-25 10:08:05.000 2016-03-25 10:09:41.000 
TC61879  2016-03-25 10:09:41.000 2016-03-25 10:52:42.000 
TC61875  2016-03-25 10:52:42.000 2016-03-25 10:53:57.000 
TC61879  2016-03-25 10:53:57.000 2016-03-25 11:59:52.000 
TC61878  2016-03-25 11:59:52.000 2016-03-25 12:00:08.000 
TC61879  2016-03-25 12:00:08.000 2016-03-25 12:04:42.000 
TC61878  2016-03-25 12:04:42.000 2016-03-25 12:04:46.000 
TC61879  2016-03-25 12:04:46.000 2016-03-25 12:07:37.000 
TC61878  2016-03-25 12:07:37.000 2016-03-25 12:07:47.000 
TC61879  2016-03-25 12:07:47.000 2016-03-25 12:11:30.000 

ich verschiedene Dinge mit Fensterfunktionen versucht haben, und schließt sich, aber ich halte das Problem haben, dass, wenn ein Benutzer Schalter von einem Arbeitsplatz zum ein anderes und zurück spiegeln die Daten nicht wider, wenn der Benutzer etwas auf der anderen Arbeitsstation getan hat.

select station from resulttable where @datetime between from and to 

sollte diese Abfrage nur eine Zeile als Ergebnis geben

Schließlich einen Benutzer in einer bestimmten Datumzeit bestimme ich mag diese Daten verwenden, wo.

Wie soll ich das angehen?

Antwort

0

Sie möchten Gruppen basierend auf Änderungen in einer Spalte (geordnet nach Zeit) zuweisen. Es gibt einen „Trick“ den Unterschied von Zeilennummern verwenden, die dies ganz einfach macht:

select station, min(timestamp), max(timestamp) 
from (select t.*, 
      row_number() over (order by timestamp) as seqnum_t, 
      row_number() over (partition by station order by timestamp) as seqnum_wst 
     from t 
    ) t 
group by (seqnum_t - seqnum_wst), station; 

Wenn man sich die fortlaufenden Nummern suchen, die erzeugt werden, wird die erste, die Reihen aufzählt. Der zweite zählt die Zeilen in jeder Station auf. Wenn die Zeilen sequenziell sind, ist die Differenz konstant.

+0

Ich war so nah und doch so weit weg. Ich hätte nie an eine solche Lösung gedacht. Vielen Dank! – Bram

Verwandte Themen