2017-02-08 1 views
1

Ich habe eigentlich keine Ahnung, wie eine solche Abfrage durchführen. Ich habe 2 Tabellen in meinem Google BigQuery:2 Tabellen beitreten: Impressions zählen vor der Konvertierung

erste Tabelle (Impressionen):

+-----------+--------+------------+-------+ 
| Timestamp | UserID | Event_Type | Count | 
+-----------+--------+------------+-------+ 
|  100 | 111 | impression |  2 | 
|  105 | 111 | impression |  1 | 
|  110 | 111 | impression |  1 | 
|  120 | 111 | impression |  2 | 
|  100 | 222 | impression |  1 | 
|  105 | 222 | impression |  1 | 
|  110 | 222 | impression |  1 | 
|  120 | 222 | impression |  1 | 
+-----------+--------+------------+-------+ 

zweite Tabelle (Conversions):

+-----------+--------+------------+-------+ 
| Timestamp | UserID | Event_Type | Count | 
+-----------+--------+------------+-------+ 
|  115 | 111 | conversion |  1 | 
|  117 | 222 | conversion |  1 | 
+-----------+--------+------------+-------+ 

Was ich zu bekommen - Anzahl der Impressions pro Benutzer benötigt für die Konvertierung, also muss ich alle Impressionen zählen, die vor der Konvertierung passiert sind (nach Zeitstempel - es ist tatsächlich im Unix-Format).

+--------+--------------------+ 
| UserID | Impressions Needed | 
+--------+--------------------+ 
| 111 |     4 | 
| 222 |     3 | 
+--------+--------------------+ 

Ich kann diese Tabellen von UserID JOIN und Gesamtzahl der Impression und Conversions erhalten, kann ich ihnen Vereinigung und Art von Benutzer-ID und Zeitstempel, aber ich habe keine Ahnung, wie die endgültige Antwort zu bekommen, so habe ich leider nichts hier zu zeigen. Ich hoffe, es gibt einen Weg dies zu tun und jemand hier kann mir dabei helfen.

Die Antwort ist (Standard-SQL):

SELECT t2.User_ID, COUNT(t1.User_ID) as ImpressionsNeeded FROM ( SELECT MIN(Event_Time) as Event_Time, User_ID, Advertiser_ID, Campaign_ID, count(*) AS Conv_Count FROM ``db.dcm_account111111.activity_111111_*`` WHERE _TABLE_SUFFIX BETWEEN '20170101' AND '20170110' AND Advertiser_ID = '888888' AND Campaign_ID = '888888' AND Event_Sub_Type = 'POSTCLICK' GROUP BY User_ID, Advertiser_ID, Campaign_ID ) as t2 LEFT JOIN ( SELECT Event_Time, User_ID, Advertiser_ID, Campaign_ID, count(*) AS Imps_Count FROM ``db.dcm_account111111.impression_111111_*`` WHERE _TABLE_SUFFIX BETWEEN '20170101' AND '20170110' AND Advertiser_ID = '888888' AND Campaign_ID = '888888' GROUP BY Event_Time, User_ID, Advertiser_ID, Campaign_ID ) as t1 ON t1.User_ID = t2.User_ID AND t1.Advertiser_ID = t2.Advertiser_ID AND t1.Campaign_ID = t2.campaign_ID AND t1.Event_Time < t2.Event_Time GROUP BY t2.User_ID ORDER BY ImpressionsNeeded DESC

Antwort

6

Das klingt wie ein left join und Aggregation:

select t2.userid, count(t1.userid) 
from table2 t2 left join 
    table1 t1 
    on t1.userid = t2.userid and 
     t1.event_type = 'impression' and 
     t1.timestamp < t2.timestamp 
group by t2.userid; 
+0

ich den obigen Beispielcode hinzugefügt haben (verwendet, um Ihre Antwort, aber es hat nicht funktioniert) –

+0

@EdgardGomezSennovskaya. . . Wechseln Sie zu Standard-SQL. –

+0

Ich habe "Use Legacy SQL" Kontrollkästchen aktiviert –

-1

OK, ich habe es. Da die Konvertierungstabelle mehrere Zeilen für dieselbe User_ID enthält, wurden meine Ergebnisse multipliziert. Also musste ich MIN verwenden, während ich die Konvertierungstabelle und dann nur die LINK-JOIN-Impressionstabelle abfrage. Der obige Code wurde behoben. Danke Gordon!

+2

Diese Seite funktioniert, indem Sie die Antwort markieren, die Ihre Frage und die Antwort beantwortet hat, nicht indem Sie Ihren eigenen Kommentar als Antwort hinzufügen. Ich würde empfehlen, dies zu entfernen und die @ Gordons-Antwort anzukreuzen, um sie als korrekt zu markieren. – webnoob

1

deckt Unter allgemeineren Fällen, wenn Sie erkennen können, wie viele Impressionen zu jeder & jede Conversion führen (nicht nur erste)
Zusatznutzen - keine jede explizite JOIN und GROUP BY

#standardSQL 
WITH all_events AS (
    SELECT ts, UserID, Event_Type, cnt FROM Impressions UNION ALL 
    SELECT ts, UserID, Event_Type, cnt FROM Conversions 
) 
SELECT ts as ConversionTS, UserID, cum_sum - 
    IFNULL(
    SUM(cum_sum) OVER(PARTITION BY UserID, Event_Type ORDER BY ts 
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0 
) AS Impressions 
FROM (
    SELECT ts, UserID, Event_Type, 
    SUM(IF(Event_Type = 'impression', cnt, 0)) OVER(PARTITION BY UserID 
     ORDER BY ts) AS cum_sum 
    FROM all_events 
) 
WHERE Event_Type = 'conversion' 

Above kann mit folgenden Daten (als Beispiel) getestet werden

WITH Impressions AS (
    SELECT 100 AS ts, 111 AS UserID, 'impression' AS Event_Type, 2 AS cnt UNION ALL SELECT 105, 111, 'impression', 1 UNION ALL SELECT 110, 111, 'impression', 1 UNION ALL 
    SELECT 120, 111, 'impression', 2 UNION ALL SELECT 123, 111, 'impression', 2 UNION ALL SELECT 125, 111, 'impression', 1 UNION ALL SELECT 130, 111, 'impression', 1 UNION ALL 
    SELECT 140, 111, 'impression', 2 UNION ALL SELECT 100, 222, 'impression', 1 UNION ALL SELECT 105, 222, 'impression', 1 UNION ALL SELECT 110, 222, 'impression', 1 UNION ALL 
    SELECT 120, 222, 'impression', 1 UNION ALL SELECT 130, 222, 'impression', 1 UNION ALL SELECT 135, 222, 'impression', 1 UNION ALL SELECT 140, 222, 'impression', 1 UNION ALL 
    SELECT 150, 222, 'impression', 1 
), 
Conversions AS (
    SELECT 115 AS ts, 111 AS UserID, 'conversion' AS Event_Type, 1 AS cnt UNION ALL 
    SELECT 135, 111, 'conversion', 1 UNION ALL SELECT 117, 222, 'conversion', 1 UNION ALL SELECT 147, 222, 'conversion', 1 
) 

Erwartetes Ergebnis ist als unten

ConversionTS UserID Impressions 
115    111  4  
135    111  6  
117    222  3  
147    222  4