2016-03-24 7 views
1

Wir lieben BigQuery, es ist erstaunlich, und wir verwenden es sehr, aber wir haben ein Problem mit der Select-Anweisung, aus irgendeinem Grund, wenn Sie ein Select basierend auf Variablen erstellen, die Sie nicht funktioniert, aber wenn Sie den vollständigen Code der Variablen verwenden tut esBigQuery Problem mit Select bei Verwendung von AS

der Fehler ich erhalte die folgende -

Error: (L5:47): Expression 'RequestsPerSession' is not present in the GROUP BY list 

vom Kurs wollen wir nicht auf der Grundlage dieser Variable aggregieren - da es keine in ist der Abschnitt GROUP BY.

funktioniert das nicht

SELECT 
    ch, 
    COUNT(Distinct(AC_SessionID),15000000) As UniqueSessions, 
    COUNT(IF(Action CONTAINS "request_data",1,NULL)) AS Requests, 
    ROUND(Requests/UniqueSessions,1) AS RequestsPerSession 

Diese

funktioniert
SELECT 
    ch, 
    COUNT(Distinct(AC_SessionID),15000000) As UniqueSessions, 
    COUNT(IF(Action CONTAINS "request_data",1,NULL)) AS Requests, 
    ROUND(COUNT(IF(Action CONTAINS "request_data",1,NULL))/UniqueSessions,1) AS RequestsPerSession 

Irgendwelche Ideen auf, wie man es beheben?

Gibt es auch eine Möglichkeit, eine Variable innerhalb der Select-Funktion für Berechnungszwecke zu erstellen, aber nicht in den Endergebnissen erscheinen?

+0

in einer abgeleiteten Tabelle einen Teil der Logik Put. – jarlh

+1

Sie sollten eine Unterabfrage mit einer abgeleiteten Tabelle verwenden. Es wird zu kompliziert für Sie, und später werden Sie nicht finden, wo der Datenfehler herkommt. Haben Sie keine Angst, Unterabfragen zu verwenden, sie sind gut und überhaupt keine Leistung. – Pentium10

Antwort

1

Irgendwelche Ideen, wie man es beheben kann?

Die GROUP BY Klausel können Sie gruppieren Zeilen, die die gleichen Werte für ein bestimmtes Feld oder eine Reihe von Feldern, so dass Sie Aggregationen von verwandten Bereichen berechnen kann. Daher können Sie in der SELECT-Liste entweder Felder haben, nach denen Sie gruppieren, oder aggregations Akzeptieren oben - Ihr erstes Beispiel schlägt wie erwartet fehl und das zweite Beispiel funktioniert wie erwartet.

Also, nichts wirklich zu reparieren!

Gibt es eine Möglichkeit, eine Variable innerhalb der Auswahlfunktion für Berechnungszwecke zu erstellen, aber nicht in den Endergebnissen erscheinen?

Sie subquery für dieses
Zum Beispiel können Sie Ihre ursprüngliche Abfrage unter der Annahme:

SELECT 
    ch, 
    COUNT(DISTINCT(AC_SessionID),15000000) AS UniqueSessions, 
    COUNT(IF(Action CONTAINS "request_data",1,NULL)) AS Requests, 
    ROUND(COUNT(IF(Action CONTAINS "request_data",1,NULL))/UniqueSessions,1) AS RequestsPerSession 
FROM YourTable 
GROUP BY ch 

Mit subquery es als so etwas wie folgt aussehen kann:

SELECT 
    ch, 
    COUNT(DISTINCT(AC_SessionID),15000000) AS UniqueSessions, 
    COUNT(request) AS Requests, 
    ROUND(COUNT(request)/COUNT(DISTINCT(AC_SessionID),15000000),1) AS RequestsPerSession 
FROM (
    SELECT 
    ch, 
    AC_SessionID, 
    IF(Action CONTAINS "request_data",1,NULL) AS request 
    FROM YourTable 
) 
GROUP BY ch 

die weiter sein können "transformiert" zu

SELECT 
    ch, 
    UniqueSessions, 
    Requests, 
    ROUND(Requests/UniqueSessions, 1) AS RequestsPerSession 
FROM (
    SELECT 
    ch, 
    COUNT(DISTINCT(AC_SessionID),15000000) AS UniqueSessions, 
    COUNT(request) AS Requests, 
    FROM (
    SELECT 
     ch, 
     AC_SessionID, 
     IF(Action CONTAINS "request_data",1,NULL) AS request 
    FROM YourTable 
) 
    GROUP BY ch 
) 

At welche sich mit solchen „Optimierung“ zu gehen, ist bis zu persönlichen Vorlieben, ich denke

Wie für die Unterabfrage Option, es ist nicht die Datenmenge zu erhöhen , die wir laufen auf, wie es ist Verdoppelung der Daten (fast doppelt) - wir viele Daten haben so Kosten zu einem Problem startet

Innerhalb der gleichen Abfrage können Sie mehrere Unterabfragen gegen die gleiche Tabelle (n) haben, und Sie werden nur dann aufgeladen werden wie du es tust! So funktioniert die Abrechnung. Also solltest du dir keine Sorgen machen.BigQuery ist intelligent genug, um die tatsächliche Datennutzung zu optimieren, daher sollte die Leistung auch keine große Rolle spielen. Ich denke

+0

Warum wird meine erste Version nicht berücksichtigt und Aggregationen, während die zweite ist. –

+0

zweite Version hat COUNT(), die als Aggregationsfunktion gilt, während die erste Version nicht! Weitere Informationen finden Sie unter https://cloud.google.com/bigquery/query-reference#aggfunctions - es ist in meiner Antwort verlinkt, aber fügen Sie es hier wieder ein –

+0

Vielen Dank für Ihre Antwort, aber nur um zu klären, die Variable Requests in meinem erste Version ist und Aggregation, macht das nicht die zweite Zeile, die es auch Aggregation verwendet, es scheint nur nicht effizient, den Code erneut zu schreiben, wenn es eine Variable gibt, die diesen Wert bereits hostet. Wie für die Unterabfrage-Option, korrigieren Sie mich, wenn ich falsch liege, aber es erhöht nicht die Menge der Daten, die wir ausführen, da es die doppelte Datenmenge (fast doppelt) ist - wir haben viele Daten, so dass Kosten zu einem Problem werden . –

0

Irgendwelche Ideen, wie man es beheben kann?

versuchen unter „Abhilfe“

SELECT 
    ch, 
    COUNT(Distinct(AC_SessionID),15000000) As UniqueSessions, 
    COUNT(IF(Action CONTAINS "request_data",1,NULL)) AS Requests, 
    ROUND(Requests/UniqueSessions,1) * MAX(1) AS RequestsPerSession 

Ich erkannte, dass sieht aus wie Motor einen Hinweis zu verstehen, dass dieser bestimmte Bereich (RequestsPerSession) ist nicht für die Gruppierung durch, sondern Aggregation benötigt.

Unten ist, wie ich "getestet"

SELECT id, 
    COUNT(a) AS b, 
    SUM(a) AS c, 
    COUNT(a)/SUM(a) AS k1, 
    b/SUM(a) AS k2, 
    COUNT(a)/c AS k3, 
    MAX(1) * (b/c) AS k4 
FROM 
(SELECT 1 AS id, 1 AS a), 
(SELECT 1 AS id, 2 AS a), 
(SELECT 1 AS id, 3 AS a), 
(SELECT 1 AS id, 4 AS a), 
(SELECT 2 AS id, 1 AS a), 
(SELECT 2 AS id, 2 AS a), 
(SELECT 2 AS id, 3 AS a), 
GROUP BY id 
Verwandte Themen