2017-07-14 5 views
1

folgende ist meine Tabelle und Beispieldatenselbst verbindet mit Aggregatfunktion

user_id | session_id | time_stamp | source | medium | new_source | new_medium 

1  | 1   | 2017-01-01 | google | search 
1  | 2   | 2017-01-02 | google | search 
1  | 3   | 2017-01-03 | direct | none 



2  | 1   | 2017-03-11 | google | search 
2  | 2   | 2017-04-21 | direct | none 
2  | 3   | 2017-04-22 | google | search 

Ich mag die neue Quelle und neue Medium Spalte für jeden Benutzer aktualisieren, wenn es Bedingungen erfüllt `, wenn der Benutzer eine direkte Quelle für die letzten | max Zeitstempel. Die neue Quelle und der neue Medienwert müssen die letzte nicht direkte Quelle & sein. Nachfolgend Ergebnis erwartet

user_id | session_id | time_stamp | source | medium | new_source | new_medium 

1  | 1   | 2017-01-01 | google | search 
1  | 2   | 2017-01-02 | google | search 
1  | 3   | 2017-01-03 | direct | none |google  | search 



2  | 1   | 2017-03-11 | google | search 
2  | 2   | 2017-04-21 | direct | none 
2  | 3   | 2017-04-22 | google | search 

Die Abfrage Ich habe versucht (funktioniert nicht)

SELECT a.domain_userid, 
    a.session_id, 
    a.source, 
    a.medium, 
    b.source AS new_source, 
    b.medium AS new_medium 
FROM table a 
    LEFT JOIN table b ON a.domain_userid = b.domain_userid 
    LEFT JOIN (SELECT domain_userid, 
      MAX(time_stamp) as time_stamp 
    FROM table 
    WHERE source != 'direct' 
    GROUP BY domain_userid) AS c ON b.time_stamp = c.time_stamp and 
c.user_id=b.user_id 
WHERE a.source = 'direct' 

Jede Hilfe wird geschätzt.

Hinweis: Um den gleichen Tisch sitzt und direkt den letzten Wert none nehmen

Antwort

1

Sie wollen Fensterfunktionen verwenden. Wenn es nie zwei „direkte“ s in einer Reihe ist, dann ist die einfachste Art und Weise verwendet lag():

select t.*, 
     (case when row_number() over (partition by user_id order by time_stamp desc) = 1 and 
        source = 'direct' 
      then lag(source) over (partition by user_id order by times_stamp) 
      else source 
     end) as new_source, 
     (case when row_number() over (partition by user_id order by time_stamp desc) = 1 and 
        source = 'direct' 
      then lag(medium) over (partition by user_id order by times_stamp) 
      else medium 
     end) as new_medium 
from t.*; 
+0

Partitionierung zweimal nicht teuer ist? –

+0

@ pramodniralakeri. . . Verglichen mit was? –

+0

im Vergleich zu Self Join mit Aggregat oder so ähnlich? korrigiere mich, wenn ich falsch denke/rede –

Verwandte Themen