2016-08-01 9 views
0

Ich versuche, eine Funktion mit bigquery UDF zu schreiben, um eine Liste von Zeichenfolgen mit anderen Zeichenfolgen zu vergleichen. Grundsätzlich möchte ich wissen, wie viele neue Nutzer wir pro Woche haben und von diesen neuen Nutzern, wie viele von ihnen in den kommenden Wochen unsere Website besuchen. Dafür habe ich eine Abfrage erstellt, die mir eine Zeichenkette aller E-Mails pro Woche (mit group_concat) liefert und als Tabelle speichert. Jetzt müssen Sie wissen, wie ich jedes mit anderen Sammlungen von E-Mails pro Woche vergleichen kann. Am Ende würde ich so einen Tisch haben mag:Eine Stringvergleichsfunktion in bigquery schreiben

+----------------+-------+-------+--------+------+ 
|  | week 1 | week 2 | week 3| week 4 | ... | 
+----------------+-------+-------+--------+------+ 
| week1 | 17 | 7 | 5 | 9 | ... | 
+----------------+-------+-------+--------+------+ 
| week2 |  | 19 | 13 | 8 | ... | 
+-----------------+-------+-------+--------+-----+ 
| week3 |  |  | 24 | 15 | ... | 
+-----------------+-------+-------+--------+-----+ 

Antwort

2

Nur um Ihnen eine Idee zu geben, mit

SELECT 
    CONCAT('week', STRING(prev)) AS WEEK, 
    SUM(IF(next=19, authors, 0)) AS week19, 
    SUM(IF(next=20, authors, 0)) AS week20, 
    SUM(IF(next=21, authors, 0)) AS week21, 
    SUM(IF(next=22, authors, 0)) AS week22, 
    SUM(IF(next=23, authors, 0)) AS week23 
FROM (
    SELECT prev, next, COUNT(author) AS authors 
    FROM (
    SELECT 
     prev_week.week_created AS prev, 
     next_week.week_created AS next, 
     prev_week.author AS author 
    FROM (
     SELECT 
     WEEK(SEC_TO_TIMESTAMP(created_utc)) AS week_created, 
     author 
     FROM [fh-bigquery:reddit_posts.2016_05] 
     GROUP BY 1,2 
    ) next_week 
    LEFT JOIN (
     SELECT 
     WEEK(SEC_TO_TIMESTAMP(created_utc)) AS week_created, 
     author 
     FROM [fh-bigquery:reddit_posts.2016_05] 
     GROUP BY 1,2 
    ) AS prev_week 
    ON prev_week.author = next_week.author 
    HAVING prev <= next 
) 
    GROUP BY 1,2 
) 
GROUP BY 1 
ORDER BY 1 

Ergebnis zu spielen ist als unten
enter image description here

Diese ist am nächsten zu dem, was Sie gefragt haben, kann ich denken

In der Zwischenzeit, bitte beachten Sie - BigQuery ist weniger ta ifored für Berichte Design eher für Datenverarbeitung. Ich denke also, dass das Erstellen einer Matrix/Pivot in BigQuery (äußerer Auswahl) nicht die beste Lösung ist - es kann in Ihrem Berichtstool gemacht werden. Aber die Berechnung aller Paare prev|next|count (innere Auswahl) ist definitiv hier in BigQuery geeignet

+0

Das ist eine wirklich gute Antwort! Ich dachte ganz anders. Ich habe den Code bereits mit Java geschrieben. Deshalb habe ich mir überlegt, eine einzigartige Sammlung zu erstellen, um alle E-Mails pro Woche zu speichern und mit anderen Wochen zu vergleichen. Was ich gelesen habe, ist mit UDF nicht möglich. – AnaHid