2016-12-12 2 views
0

Ich habe die folgende Tabelle:BigQuery: Filter wiederholt Felder mit Legacy-SQL

row | query_params | query_values 
1  foo   bar 
     param   val 
2  foo   baz 

JSON:

{ 
"query_params" : [ "foo", "param"], 
"query_values" : [ "bar", "val" ] 
}, { 
"query_params" : [ "foo" ], 
"query_values" : [ "baz" ] 
} 

Mit Legacy-SQL ich auf ihren Wert wiederholt Feld filtern wollen, so etwas wie

SELECT * FROM table WHERE query_params = 'foo' 

Welche ausgeben würde

row | query_params | query_values 
1  foo   bar 
2  foo   baz  

PS: Diese Frage wird auf die gleiche Frage im Zusammenhang jedoch unter Verwendung von Standard-SQL beantwortet here

+0

Ich werde versuchen, Ihre Frage zu beantworten, es sei denn, dass mich jemand schlägt es, aber können Sie erklären, warum Sie benötigen Legacy-SQL benutzen? Wir möchten sicherstellen, dass uns Inkompatibilitäten mit Standard-SQL bekannt sind, damit wir sie beheben können. Vielen Dank! –

+0

Ich migriere ein benutzerdefiniertes Dashboard nach Mode Analytics, aber ich habe gerade herausgefunden, dass Modus noch nicht Standard-SQL unterstützt. –

+0

Nur zur Bestätigung, ich vermute, dass der ['# standardSQL'] (https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql#sql-prefix) Trick nicht funktioniert Ich arbeite auch nicht dort, richtig? –

Antwort

0

Ich kann mir keine bessere Ideen für Legacy-SQL, mit der Ausnahme eines JOIN nach jedem Array separat Abflachung. Wenn Sie eine Tabelle mit dem Inhalt T oben angegeben haben, können Sie tun:

SELECT 
    [t1.row], 
    t1.query_params, 
    t2.query_values 
FROM 
    FLATTEN((SELECT [row], query_params, POSITION(query_params) AS pos 
      FROM T WHERE query_params = 'foo'), query_params) AS t1 
JOIN 
    FLATTEN((SELECT [row], query_values, POSITION(query_values) AS pos 
      FROM T), query_values) AS t2 
ON [t1.row] = [t2.row] AND 
    t1.pos = t2.pos; 

Die Idee ist, die Elemente der beiden Arrays von Reihen- und Position nach Filterung für query_params zu assoziieren, die auf 'foo' gleich sind.

+0

Problem ist [Zeile] ist keine Spalte. Ich habe versucht, ROW_NUMBER() OVER() [row] statt, aber ich bekomme "Verwendung wiederholter Felder mit analytischen Funktionen ist nicht erlaubt" –

+0

Es sieht wie Mode Analytics unterstützt [Einstellung Standard-SQL für Ihre BigQuery Verbindung] (https: // help. modeanalytics.com/articles/using-standard-or-legacy-sql/) jetzt, also solltest du das wahrscheinlich einfach verwenden :) Du kannst auch '# standardSQL' im Abfragetext selbst verwenden. –

+0

Ja, aber ich habe zu Metabase gewechselt, nachdem Mode ihren Preisplan erhöht hat und sie Standard-SQL noch nicht unterstützen. –

0

Versuchen unter Version

SELECT [row], query_params, query_values 
    FROM (
     SELECT [row], query_params, param_pos, query_values, POSITION(query_values) AS value_pos 
     FROM FLATTEN((
      SELECT [row], query_params, POSITION(query_params) AS param_pos, query_values 
      FROM YourTable 
     ), query_params) 
     WHERE query_params = 'foo' 
    ) 
    WHERE param_pos = value_pos 
Verwandte Themen