Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Abfrage mittels Between?

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von ncpschmidt, 1 Februar 2016.

  1. ncpschmidt

    ncpschmidt Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden