2017-02-23 2 views
-1

Könnten Sie mir bitte ein bisschen mit Bigquery's Syntaxfrage helfen, bitte? Ich versuche zu verstehen, warum (und wie es zu beheben) diese Standardsql-Abfrage gibt 2 Zeilen zurück, während dieser Legacysql man nur 1 zurückgibt (und ich erwarte nur 1).Warum Bigquery's Standardsql gibt mehrere Zeilen während Legacysql nur eine?

StandardSQL

SELECT 
    hits2.transaction.transactionId as transactionId 
    FROM `ga-export-TTTT.1234567890.ga_sessions_*` 
    ,UNNEST (hits) as hits2 

WHERE 
hits2.transaction.transactionId = '03971163' 

LegacySQL

select 
hits.transaction.transactionId 
FROM 
TABLE_DATE_RANGE([ga-export-TTTT:1234567890.ga_sessions_], TIMESTAMP('2016-09-01'), TIMESTAMP('2017-02-14')) 
WHERE 
hits.transaction.transactionId = '03971163' 

Nach Hilfe Lesen Ich versuchte auch dieses StandardSQL eine mit den gleichen zwei Zeilen in den Ergebnissen:

select 
title 
from 
(
    SELECT 
    ARRAY(SELECT transaction.transactionId FROM UNNEST(hits) 
      WHERE transaction.transactionId = '03971163') AS title 
    FROM `ga-export-TTTTT.1234567890.ga_sessions_*` 
) 
WHERE ARRAY_LENGTH(title) > 0; 

Ich würde mich über jede Hilfe freuen.

Antwort

0

Versuchen Sie stattdessen:

#standardSQL 
SELECT 
    ARRAY(SELECT transaction.transactionId 
     FROM UNNEST(hits) 
     WHERE transaction.transactionId = '03971163') 
    AS transactionIds 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 

Wenn Sie CROSS JOIN mit einem Array verwenden, können Sie für jedes Array-Element eine Zeile im Ergebnis. Wenn Sie eine Eins-zu-eins-Entsprechung mit den Zeilen in der Tabelle wünschen, können Sie eine Array-Unterabfrage (wie in der obigen Abfrage) verwenden, um die Array-Elemente nach dem Anwenden eines Filters neu zu packen.

#standardSQL 
SELECT 
    ARRAY(SELECT AS STRUCT transaction.* 
     FROM UNNEST(hits) 
     WHERE transaction.transactionId = '03971163') 
    AS transactions 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 

Dies wird ein Array von allen Feldern innerhalb transaction für Treffer passend zum Zustand der transaction.transactionId = '03971163': Als ein weiteres Beispiel können Sie eine ARRAY Unterabfrage zusammen mit SELECT AS STRUCT verwenden. Wenn Sie nur ein einzelnes Element des Arrays möchten, können Sie eine Unterabfrage in der Auswahlliste mit einem LIMIT statt:

#standardSQL 
SELECT 
(SELECT transaction.transactionId 
    FROM UNNEST(hits) 
    WHERE transaction.transactionId = '03971163' 
    LIMIT 1) 
    AS transactionId 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 

Oder:

#standardSQL 
SELECT 
(SELECT transaction 
    FROM UNNEST(hits) 
    WHERE transaction.transactionId = '03971163' 
    LIMIT 1) 
    AS transaction 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`; 
+0

Dank @Elliott. Leider funktioniert das nicht. Beide Beispiele geben eine enorme Anzahl an Zeilen zurück, sollten aber nur eine sein. – user912830823

+0

Die von mir angegebene Abfrage gibt alle Elemente dieses Arrays zurück, die mit der Transaktions-ID übereinstimmen. Wenn Sie nur ein Element des Arrays möchten, verwenden Sie stattdessen 'LIMIT'; Siehe meine Bearbeitung. –

+0

Hey @Elliot, meine Frage war, wie man Ergebnisse erhalten, ähnlich wie ich mit legacysql. Limit 1 funktioniert in diesem Fall nicht. – user912830823

0

Der einzige Unterschied in der zwei Abfragen (für Legacy- und Standard-SQL-Versionen) Ich sehe, dass Sie möglicherweise verschiedene Tabellen abfragen!

in Legacy-SQL Version - beschränken Sie Tabellen-Liste für einen Zeitraum von TIMESTAMP ('2016.09.01') bis TIMESTAMP ('2017.02.14'), während in Standard-SQL Sie alle ga_sessions_ Tabellen abfragen in ga-export-TTTT.1234567890 Dataset

unten Versuchen Tabellen derselben Liste zu filtern, wie in Legacy-SQL

#standardSQL 
SELECT hits2.transaction.transactionId as transactionId 
FROM `ga-export-TTTT.1234567890.ga_sessions_*`, UNNEST (hits) as hits2 
WHERE hits2.transaction.transactionId = '03971163' 
AND _TABLE_SUFFIX BETWEEN '20160901' AND '20170214' 
Verwandte Themen