2017-06-28 6 views
0

Ich habe Probleme beim Gruppieren aufeinanderfolgender Zeilen (geordnet nach Zeitstempel), wobei der Unterschied zwischen den Zeitstempeln weniger als 60 Sekunden beträgt.Wie gruppieren Zeilen basierend auf der Berechnung?

Hier ist eine Beispieltabelle:

user video  timestamp     time_diff 
---- -------- ----------------------- --------- 
Bob  balldrop 2017-06-01 06:00:00 UTC  null 
Bob  balldrop 2017-06-01 06:00:10 UTC  -10 
Bob  balldrop 2017-06-01 06:00:30 UTC  -20 
Bob  balldrop 2017-06-01 06:00:45 UTC  -15 
Bob  balldrop 2017-06-01 06:04:00 UTC  -195 
Bob  balldrop 2017-06-01 06:04:30 UTC  -30 
Bob  bounce  2017-06-01 06:05:00 UTC  null 
Bob  bounce  2017-06-01 06:05:20 UTC  -20 

Wunschergebnisse:

user video  timestamp     group 
---- -------- ----------------------- --------- 
Bob  balldrop 2017-06-01 06:00:00 UTC  1 
Bob  balldrop 2017-06-01 06:00:10 UTC  1 
Bob  balldrop 2017-06-01 06:00:30 UTC  1 
Bob  balldrop 2017-06-01 06:00:45 UTC  1 
Bob  balldrop 2017-06-01 06:04:00 UTC  2 
Bob  balldrop 2017-06-01 06:04:30 UTC  2 
Bob  bounce  2017-06-01 06:05:00 UTC  3 
Bob  bounce  2017-06-01 06:05:20 UTC  3 

Antwort

2

für BigQuery Standard-SQL - mit unten spielen:

#standardSQL 
WITH data AS (
    SELECT 'Bob' AS user, 'balldrop' AS video, TIMESTAMP '2017-06-01 06:00:00 UTC' AS ts UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:00:10 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:00:30 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:00:45 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:04:00 UTC' UNION ALL 
    SELECT 'Bob', 'balldrop', TIMESTAMP '2017-06-01 06:04:30 UTC' UNION ALL 
    SELECT 'Bob', 'bounce', TIMESTAMP '2017-06-01 06:05:00 UTC' UNION ALL 
    SELECT 'Bob', 'bounce', TIMESTAMP '2017-06-01 06:05:20 UTC' 
) 
SELECT 
    user, video, ts, 
    SUM(diff) OVER(PARTITION BY user ORDER BY ts) AS group_number 
FROM (
    SELECT 
    user, video, ts, 
    IF(TIMESTAMP_DIFF(ts, LAG(ts) OVER(PARTITION BY user, video ORDER BY ts), SECOND) < 60, 0, 1) AS diff 
    FROM data 
) 
-- ORDER BY ts 

es nicht klar ist, wie Sie Gruppen für verschiedene Benutzer gruppieren möchten, damit PARTITION BY ad sein kann Justed hängt davon ab

+0

Ich hatte gehofft, du würdest antworten! Ich kann nicht glauben, dass es so einfach war. Ich versuche immer noch zu verstehen, wie Zeilen, die ein 'diff <60 haben, dieselbe' group_number' bekommen wie die Startzeile in der Partition. Scheint wie Magie! Danke wie immer! Von dir so viel lernen. – dnaeye

Verwandte Themen