2017-03-22 3 views
0

ich einen Datensatz muss bestehen bleiben, wo ich versuche, eine „Session-ID“ auf einem Zeitstempel auf Basis zu schaffen, wo bestimmte Ereignis (dh Last) in meinem Fall passiertwie verwende ich Windowing-Funktionen in SQL einen Datensatz

Meine Daten:

userid event timestamp 
xyz  load '2016-12-01 08:21:13:000' 
xyz  view '2016-12-01 08:21:14:000' 
xyz  view '2016-12-01 08:21:16:000' 
xyz  exit '2016-12-01 08:21:17:000' 
xyz  load '2016-12-02 08:01:13:000' 
xyz  view '2016-12-02 08:01:16:000' 
abc  load '2016-12-01 08:11:13:000' 
abc  view '2016-12-01 08:11:14:000' 

Was ich versuche zu erreichen ist eine neue Spalte erstellen genannt session_start_timestamp, wo die Zeile vor der letzten „Last“ für jeden Benutzer markiert ist.

Ich weiß, wie man das macht, indem ich eine Teilmenge-Tabelle erstelle (indem ich den minimalen Zeitstempel und den Selbstbeitritt nehme), aber gibt es eine Lag/Lead/Max/Partitionsfunktion, die dies stattdessen tun kann?

sollte die endgültige Ausgabe wie folgt aussehen:

userid event timestamp     session_start_timestamp 
xyz  load '2016-12-01 08:21:13:000' '2016-12-01 08:21:13:000' 
xyz  view '2016-12-01 08:21:14:000' '2016-12-01 08:21:13:000' 
xyz  view '2016-12-01 08:21:16:000' '2016-12-01 08:21:13:000' 
xyz  exit '2016-12-01 08:21:17:000' '2016-12-01 08:21:13:000' 
xyz  load '2016-12-02 08:01:13:000' '2016-12-02 08:01:13:000' 
xyz  view '2016-12-02 08:01:16:000' '2016-12-02 08:01:13:000' 
abc  load '2016-12-01 08:11:13:000' '2016-12-01 08:11:13:000' 
abc  view '2016-12-01 08:11:14:000' '2016-12-01 08:11:13:000' 
+0

Was ist Ihr RDBMS? –

+0

Ich verwende db2. – shecode

+0

ich kann mssql code in db2 umwandeln kannst du mir bitte ein beispiel geben – shecode

Antwort

1

Dieses Problem Lücke/Insel ist:

SQL DEMO (postgresql)

  1. Sie berechnen die Lücke oder Punkte brechen.
  2. Dann kumulative SUM() berechnen die Gruppen
  3. Dann wählen Sie die MIN() Zeit aus jeder Gruppe mit

-

WITH gap as (
    SELECT *, CASE WHEN "event" = 'load' THEN 1 ELSE 0 END as gap 
    FROM Table1 
), island as (
    SELECT *, SUM(gap) OVER (PARTITION BY "userid" ORDER BY "timestamp") as grp 
    FROM gap 
)  
SELECT *, MIN("timestamp") OVER (PARTITION BY "userid", "grp") as new_timestamp 
FROM island 

OUTPUT

enter image description here

Sie können die ersten zwei Abfragen zusammenführen:

WITH island as (
    SELECT *, SUM (CASE WHEN "event" = 'load' THEN 1 ELSE 0 END) 
       OVER (PARTITION BY "userid" ORDER BY "timestamp") as grp 
    FROM Table1 
)  
SELECT *, MIN("timestamp") OVER (PARTITION BY "userid", "grp") as new_timestamp 
FROM island 
+0

das funktioniert perfekt! – shecode

Verwandte Themen