2016-11-15 5 views
0

Ich versuche, zwei Tabellen auf einem berechneten Feld zu verbinden:BigQuery auf Berechnetes Feld Join

SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    [bigquery-public-data:noaa_gsod.gsod2016] AS a 
JOIN 
    [bigquery-public-data:noaa_gsod.stations] AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
JOIN 
    [test-project:0000.ga_sessions_20161002] AS c 
ON 
    c.date = CONCAT(a.year, a.mo, a.da) 
WHERE 
    b.name = "DUBAI INTL" 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC 

Ich halte die folgende Fehlermeldung erhalten:

ON clause must be AND of = comparisons of one field name from each table, with all field names prefixed with table name

ich diesen Fehler vermuten, ist ein Ergebnis der die zweite ON-Anweisung, aber ich habe alle Feldnamen mit ihrem Tabellennamen vorangestellt.

Was mache ich falsch?

+0

Verwenden Sie anstelle von Tabelle a eine Unterabfrage, die die gewünschte Funktion für Sie ausführt. Nebenbei bemerkt, ist c.date eine Zeichenfolge? –

Antwort

3

Sie müssen stattdessen standard SQL für die Abfrage ermöglichen. Sobald Sie das tun (deaktivieren Sie „Use Legacy-SQL“ unter „Optionen einblenden“), die Sie zum Beispiel ausführen können:

SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    `bigquery-public-data.noaa_gsod.gsod2016` AS a 
JOIN 
    `bigquery-public-data.noaa_gsod.stations` AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
JOIN 
    `test-project.0000.ga_sessions_20161002` AS c 
ON 
    c.date = CONCAT(a.year, a.mo, a.da) 
WHERE 
    b.name = "DUBAI INTL" 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC; 

Hier ist ein eigenständiges Beispiel, das auf dem ga_session nicht Tisch verlassen, auch:

WITH MyTable AS (
    SELECT '20161003' AS date UNION ALL 
    SELECT '20160830' 
) 
SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    `bigquery-public-data.noaa_gsod.gsod2016` AS a 
JOIN 
    `bigquery-public-data.noaa_gsod.stations` AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
JOIN 
    MyTable AS c 
ON 
    c.date = CONCAT(a.year, a.mo, a.da) 
WHERE 
    b.name = "DUBAI INTL" 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC; 
+0

Vielen Dank! Das hat den Trick gemacht. Ich war ein wenig verwirrt, warum Sie die 'MyTable'-Definition oben hinzugefügt haben, aber es ergab Sinn, nachdem ich den 'UNION ALL'-Operator nachgeschlagen hatte. Ich denke, es ist besser, wieder auf die Tabelle 'ga_sessions_20161002' in Ihrer Antwort zurückzugreifen, nur so wird klarer, wie sich die Antwort direkt auf die Frage bezieht. – faridghar

+0

Sicher, ich habe das Beispiel aktualisiert, um Ihre ursprünglichen Tabellen zu verwenden, obwohl ich auch das Standalone-Beispiel verlassen habe, falls andere Leser es ausprobieren wollen. Vielen Dank! –

0

Versuchen Sie, eine Unterabfrage:

FROM (SELECT a.*, date(CONCAT(a.year, a.mo, a.da)) as yyyymmdd 
     FROM [bigquery-public-data:noaa_gsod.gsod2016] a 
    ) a JOIN 
    [bigquery-public-data:noaa_gsod.stations] b 
    ON a.stn = b.usaf AND a.wban = b.wban JOIN 
    [test-project:0000.ga_sessions_20161002] c 
    ON c.date = a.yyyymmdd 

Oder so etwas. . . Der genaue Vergleich kann vom Typ c.date abhängen.

0

Der JOIN, den Sie verwenden, ist standardmäßig ein INNER JOIN, daher kann die ON-Klausel nur einfache Gleichheit in den Spalten bewirken.

Zum Umgehen Sie ein CROSS JOIN mit einer WHERE-Klausel verwenden müssen werden:

SELECT 
    CONCAT(year, mo, da) AS date, 
    temp 
FROM 
    [bigquery-public-data:noaa_gsod.gsod2016] AS a 
JOIN 
    [bigquery-public-data:noaa_gsod.stations] AS b 
ON 
    a.stn = b.usaf 
    AND a.wban = b.wban 
CROSS JOIN 
    [test-project:0000.ga_sessions_20161002] AS c 
WHERE 
    b.name = "DUBAI INTL" 
AND 
    c.date = CONCAT(a.year, a.mo, a.da) 
ORDER BY 
    a.year ASC, 
    a.mo ASC, 
    a.da ASC 
+1

Dies bedeutet jedoch, dass das gesamte Kreuzprodukt der beiden Tabellen vor dem Filtern berechnet wird. Es wäre besser, entweder 'CONCAT (...)' in einer Unterabfrage vor dem 'INNER JOIN' zu berechnen oder aber [Standard SQL] (https://cloud.google.com/bigquery/docs/reference/) zu verwenden. Standard-SQL /). –

Verwandte Themen