3

BigQuery のレガシー SQL で機能するクエリがあります。それが機能するように、標準 SQL でどのように記述すればよいでしょうか?

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

現在、それが与えるエラーは次のとおりです。

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

BigQuery には、レガシー SQL と標準 SQL という 2 つのクエリ モードがあります。BigQuery の標準 SQL のドキュメントを確認したところ、 BigQuery の標準 SQL 結合に関するSO の回答が 1 つしかありませんでしたが、これまでのところ、必要な重要な変更が何であるかは不明です。

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

Row    Hour
 1      A
 2      B
 3      C

Table_R は次のようになります。

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 クエリをどのように書き直して、標準 SQL で動作するようにしますか?

4

2 に答える 2

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,
  1 AS Key
FROM Table_L
CROSS JOIN ((SELECT AVG(Value) AS AverageOfR FROM Table_R))

またはそれ以下の Key フィールドが含まれる LEFT JOIN バージョン (ロジックにとって Key が本当に重要な場合 - これはどういうわけか本当だと思います)

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
于 2016-12-26T18:51:05.547 に答える
2

エラー メッセージは、keyが の列ではないことを示唆していますtable_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;
于 2016-12-26T13:16:21.453 に答える