2016-12-26 3 views
0

BigQueryのLegacy SQLで動作するクエリがあります。標準SQLでどのように記述すれば動作するのですか?BigQueryの標準SQLにLEFT JOINを書き込む方法は?

SELECT Hour, Average, L.Key AS Key FROM 
(SELECT 1 AS Key, * 
FROM test.table_L AS L) 
LEFT JOIN 
(SELECT 1 AS Key, Avg(Total) AS Average 
FROM test.table_R) AS R 
ON L.Key = R.Key ORDER BY Hour ASC 

現在のところ、それが与えるエラーです:レガシーSQLと標準SQL:

Equality is not defined for arguments of type ARRAY<INT64> at [4:74] 

BigQueryのクエリのための2つのモードがあります。 BigQuery Standard SQL documentationを見てきました.BigQueryの標準SQL結合ではone SO answerと表示されていますが、これまでのところ重要な変更が必要であるかどうかは不明です。

Table_Lは次のようになります。希望

Row Value 
1  10 
2  20 
3  30 

結果::

Row Hour Average(OfR) Key 
1  A  20   1 
2  B  20   1 
3  C  20   1 

どのように我々が動作するように、このBigQueryのレガシーSQLクエリを書き直すん

Row Hour 
1  A 
2  B 
3  C 

Table_Rはこのようになります標準SQL?

+1

このクエリを行うには何をしたいですか - バージョン

SELECT Row, Hour, AverageOfR, 1 AS Key FROM Table_L CROSS JOIN ((SELECT AVG(Value) AS AverageOfR FROM Table_R)) 

またはLEFT以下は(どういうわけか、私は真であると感じ、あなたのロジックのための非常に重要なキーがあればケースに)関与する重要な場とバージョンを登録しようか! 'key'が' table_L'の列でない限り、どちらのバージョンでも動作しません。 –

+0

は、従来のSQLで動作するクエリを表示するので、標準SQLで動作するバージョンを手助けすることができます –

+0

@MikhailBerlyantリストされたレガシーSQLで動作するクエリは既に表示されています。これは、標準SQLで使用されているときにエラーを表示するもので、これも表示されます。あなたの質問には – Praxiteles

答えて

2

- 上

WITH Table_L AS (
SELECT 1 AS Row, 'A' AS Hour UNION ALL 
SELECT 2 AS Row, 'B' AS Hour UNION ALL 
SELECT 3 AS Row, 'C' AS Hour 
), 
Table_R AS (
SELECT 1 AS Row, 10 AS Value UNION ALL 
SELECT 2 AS Row, 20 AS Value UNION ALL 
SELECT 3 AS Row, 30 AS Value 
) 
SELECT 
    Row, 
    Hour, 
    (SELECT AVG(Value) FROM Table_R) AS AverageOfR, 
    1 AS Key 
FROM Table_L 

は、あなたが「生産」で実行する必要があるクエリがある

をテストするためです下回ってみてください:あなたはこれをアプローチすることができます

SELECT 
    Row, 
    Hour, 
    (SELECT AVG(Value) FROM Table_R) AS AverageOfR, 
    1 AS Key 
FROM Table_L 

何らかの理由でJOINにバインドされている場合は、以下を使用してください。CROSS JOIN

SELECT 
    Row, 
    Hour, 
    AverageOfR, 
    L.Key AS Key 
FROM (SELECT 1 AS Key, Row, Hour FROM Table_L) AS L 
LEFT JOIN ((SELECT 1 AS Key, AVG(Value) AS AverageOfR FROM Table_R)) AS R 
ON L.Key = R.Key 
+0

説明と同様に、500万行以上あります。この回答は明示的に各行を選択する必要がありますか? – Praxiteles

+0

いいえ、これはあなたがテストし、必要なものであることを確認するための例として示されています(そうではありません)。実際には、選択した部分だけを実行してください。 –

+0

この回答は私たちのために働いていました。さまざまなバリエーションが素晴らしい追加です。 (ありがとう!) – Praxiteles

1

keytable_Lの列ではないことを示すエラーメッセージが表示されます。いいえの場合は、それをクエリに含めないでください。

単純に合計の平均値がtable_Rになっているようです。質問やコメントであなたの最近の更新に基づいて

SELECT l.*, r.average 
FROM test.table_L as l CROSS JOIN 
    (SELECT Avg(Total) as average 
     FROM test.table_R 
    ) R 
ORDER BY l.hour ASC; 
+0

この回答は、以下の他の回答も同様に私たちのために働いた。 (ありがとう!) – Praxiteles

+0

@Praxiteles。 。 。私はこれをより単純でより直接的な方法と考えています。 –

関連する問題