2016-05-30 24 views
0

reagiert Wenn ich BQ Abfrage mit ROLLUP von potenziell großem Satz von Kriterienfeld Gruppierung (in diesem Fall campaign_group_id)Kann BigQuery Teilsumme Zeilen fallen, wenn auf ROLLUP- Abfrage

zum Beispiel:

SELECT 
    campaign_group_id AS campaign_group_id, 
    DATE(DATE_ADD(TIME, 3, 'HOUR')) AS DAY, 
    SUM(impressions) AS imps 
FROM 
    [browser_traffic.2016_05_28], 
    [browser_traffic.2016_05_29] 
WHERE 
    (DATE_ADD(TIME, 3, "HOUR") >= '2016-05-28 00:00:00' 
    AND DATE_ADD(TIME, 3, "HOUR") < '2016-05-30 00:00:00') 
GROUP EACH BY ROLLUP (campaign_group_id, DAY) 
ORDER BY DAY ASC, campaign_group_id ASC 
LIMIT 500 

BQ gibt viele Zeilen mit Zwischensummen, die nicht anwendbar in meinem Anwendungsfall ist:

+-------------------+------+-----------+ 
| campaign_group_id | day | imps | 
+-------------------+------+-----------+ 
|    NULL | NULL | 158423933 | 
|    61 | NULL |   0 | 
|    496 | NULL |  79870 | 
|    497 | NULL |  10492 | 
|    809 | NULL |   0 | 
|    936 | NULL |  2451 | 
|    937 | NULL |   0 | 
|    940 | NULL |  6844 | 
|    942 | NULL | 207685 | 
|    946 | NULL |   0 | 
|    961 | NULL |   0 | 
|    975 | NULL |  16167 | 
|    976 | NULL |  15767 | 
|    1018 | NULL |   0 | 
|    1020 | NULL |   0 | 
|    1022 | NULL | 766875 | 
|    1039 | NULL | 355765 | 
... 

ich muß irgendwie Wert Ihre Zeilen aus dem Ergebnis verringern, aber intakt Endsumme Reihe verlassen (die erste Zeile in obigem Ergebnis)

Ist es möglich, dass BQ nur die Gesamtzeile für ausgewählte Felder zurückgibt?

Antwort

1

Sie können das Ergebnis der Abfrage mit einem anderen SELECT-Filter Erklärung:

SELECT campaign_group_id, day, imps 
FROM (
    ... your rollup query with LIMIT removed ... 
) 
WHERE (day IS NOT NULL) OR (campaign_group_id IS NULL) 
LIMIT 500 
+0

Danke @Michael - ich denke es ist genau das, was ich brauche! – Andrew

+0

Ich habe heute den Vorschlag getestet, aber wenn ich mehr Gruppierungsspalten habe, enthält das Ergebnis auch Zwischensummenzeilen. Mehr Probleme werden vorhanden sein, wenn solche Spalten Nullable sind, die genau im Rahmen meiner Anwendungsfälle ist ... – Andrew

+1

Verwenden Sie GROUPING(), blättern Sie für die vollständige Antwort –

0

Wenn Sie in Endsummen interessiert sind - werden Sie wahrscheinlich nicht brauchen ROLLUP

Vielmehr können Sie wie unter regulären GROUP betrachten BY

SELECT 
    DATE(DATE_ADD(TIME, 3, 'HOUR')) AS DAY, 
    SUM(impressions) AS imps 
FROM 
    [browser_traffic.2016_05_28], 
    [browser_traffic.2016_05_29] 
WHERE 
    (DATE_ADD(TIME, 3, "HOUR") >= '2016-05-28 00:00:00' 
    AND DATE_ADD(TIME, 3, "HOUR") < '2016-05-30 00:00:00') 
GROUP 1 
ORDER BY DAY ASC 
LIMIT 500 
+0

ich meine Frage aktualisiert .. ich in Endsumme und Datenzeilen interessiert als gut, aber nicht Wert Ihre Zeilen. Vielen Dank für Ihre Antwort – Andrew

0

Beachten Sie, dass die Funktion GROUPING() existiert auch, und wird Ihnen dabei helfen:

SELECT year, name, SUM(number) s, 
     GROUPING(year) is_grouping_year, 
     GROUPING(name) is_grouping_name 
FROM [bigquery-public-data:usa_names.usa_1910_2013] 
WHERE name IN ('John', 'Jovana') 
AND year BETWEEN 2012 AND 2013 
GROUP BY ROLLUP(name, year) 
ORDER BY year, name 

year name s  is_grouping_year is_grouping_name  
null null 21182 1     1  
null John 21164 1     0  
null Jovana 18  1     0  
2012 John 10576 0     0  
2012 Jovana 18  0     0  
2013 John 10588 0     0 

Grundsätzlich Sie für die Zeilen fragen, wo is_grouping_year und is_grouping_name entweder beide 0 oder 1.

Aus der Dokumentation:

Wenn die ROLLUP-Funktion, können Sie die GROUPING-Funktion verwenden können, bis unterscheiden zwischen Zeilen, die wegen der ROLLUP -Funktion hinzugefügt wurden, und Zeilen, die tatsächlich einen NULL-Wert für den Gruppenschlüssel haben.

https://cloud.google.com/bigquery/query-reference#groupby

+0

Ja, war dort ... In meinem Abfragedatum ist berechnet Feld zB DATE (DATE_ADD (TIME, 3, 'HOUR') ist also für GROUPING nicht verfügbar. Aber ich versuche, es in Subselect einzupacken. – Andrew