Abfrage mittels Between?

ncpschmidt

Benutzer
Beiträge
12
Tabelle:

id
timestamp
userID
status

Beispieldatensätze:

1 --- 2016-01-27 22:29:18 --- 1 --- start
2 --- 2016-01-27 22:31:11 --- 1 --- end
3 --- 2016-01-27 22:31:11 --- 1 --- start
4--- 2016-01-27 22:31:12 --- 1 --- break
5 --- 2016-01-27 22:31:13 --- 1 --- work
6 --- 2016-01-27 22:31:15 --- 1 --- end

Kann ich mit einer Abfrage Infos darüber erlangen, wie lange der User z. B. im Status "break" verbracht hat und wenn ja, wie? In dem Fall ja nur eine Sekunde. Die Idee dahinter ist eine Zeiterfassung. Oder eignet sich die Struktur der Tabelle für die Präsenz des Anwenders nicht?
 
Werbung:
Das ist eigentlich recht einfach lösbar:

Code:
test=*# select * from (select *, ts - lag(ts) over(order by ts) as duration, lag(status) over (order by ts) as last_status from ncp) foo where last_status = 'break';
 id |  ts  | status | duration | last_status
----+---------------------+--------+----------+-------------
  5 | 2016-01-27 22:31:13 | work  | 00:00:01 | break
(1 Zeile)

test=*# select * from ncp;
 id |  ts  | status
----+---------------------+--------
  1 | 2016-01-27 22:29:18 | start
  2 | 2016-01-27 22:23:11 | end
  3 | 2016-01-27 22:31:11 | start
  4 | 2016-01-27 22:31:12 | break
  5 | 2016-01-27 22:31:13 | work
  6 | 2016-01-27 22:31:15 | end
(6 Zeilen)

test=*# select *, ts - lag(ts) over(order by ts) as duration, lag(status) over (order by ts) as last_status from ncp;  id |  ts  | status | duration | last_status
----+---------------------+--------+----------+-------------
  2 | 2016-01-27 22:23:11 | end  |  |
  1 | 2016-01-27 22:29:18 | start  | 00:06:07 | end
  3 | 2016-01-27 22:31:11 | start  | 00:01:53 | start
  4 | 2016-01-27 22:31:12 | break  | 00:00:01 | start
  5 | 2016-01-27 22:31:13 | work  | 00:00:01 | break
  6 | 2016-01-27 22:31:15 | end  | 00:00:02 | work
(6 Zeilen)

test=*# select * from (select *, ts - lag(ts) over(order by ts) as duration, lag(status) over (order by ts) as last_status from ncp) foo where last_status = 'break';
 id |  ts  | status | duration | last_status
----+---------------------+--------+----------+-------------
  5 | 2016-01-27 22:31:13 | work  | 00:00:01 | break
(1 Zeile)

test=*#

Das Problem für Dich ist lediglich, daß MySQL keine Windowfunktionen und damit auch lein lag() kennt. Möglicherweise eignet sich zwar die Struktur Deiner Tabelle für die Aufgabe, nicht aber die Wahl der Datenbank.
 
Zurück
Oben