2016-08-16 6 views
2

できるだけ明確に問題を説明しようとしますが、そうでない場合は教えてください。BigQueryの繰り返しフィールドの合計

私はこのようになりますテーブル[MyTable]を持っている:

---------------------------------------- 
|chn:integer | auds:integer (repeated) | 
---------------------------------------- 
|1   |3916      | 
|1   |4983      | 
|1   |6233      | 
|1   |1214      | 
|2   |1200      | 
|2   |900      | 
|2   |2030      | 
|2   |2345      | 
---------------------------------------- 

Audsは常に4回繰り返されます。

私はSELECT chn, auds FROM [MyTable] WHERE chn = 1を照会した場合、私は次のような結果を得る:私はSELECT chn, auds FROM [MyTable] WHERE (chn = 1 OR chn = 2)を照会した場合、私は次のような結果を得る

------------------- 
|Row | chn | auds | 
------------------- 
|1 |1 |3916 | 
|2 |1 |4983 | 
|3 |1 |6233 | 
|4 |1 |1214 | 
------------------- 

:論理的に

------------------- 
|Row | chn | auds | 
------------------- 
|1 |1 |1200 | 
|2 |1 |900 | 
|3 |1 |2030 | 
|4 |2 |2345 | 
------------------- 

を、私は二倍の結果を得るが、私が得たいのは、chn = 1chn = 2audsの繰り返しフィールドのSUM()、または視覚的には次のようなものです:

------------------- 
|Row | chn | auds | 
------------------- 
|1 |3 |5116 | 
|2 |3 |5883 | 
|3 |3 |8263 | 
|4 |3 |3559 | 
------------------- 

私が何かをしようとした:

SELECT a1+a2 FROM 

(SELECT auds AS a1 FROM [MyTable] WHERE chn = 1), 
(SELECT auds AS a2 FROM [MyTable] WHERE chn = 2) 

しかし、私は次のエラーを取得する:

Error: Cannot query the cross product of repeated fields a1 and a2. 
+1

例を1440ではなく2~4の「繰り返し」に簡略化し、入力と出力の明確な例を提供することをお勧めします。 –

+0

@MikhailBerlyantちょっと編集しました。アドバイスありがとうございます。 – leodaily

答えて

2

これは、(「表示オプション」の下に「使用レガシーSQLを」オフ)standard SQLとロジックのこの種を表現するためにはるかに簡単です。

WITH MyTable AS (
    SELECT 
    1 AS chn, 
    [2, 3, 4, 5, 6] AS auds 
    UNION ALL SELECT 
    2 AS chn, 
    [7, 8, 9, 10, 11] AS auds 
) 
SELECT 
    chn, 
    (SELECT SUM(aud) FROM UNNEST(auds) AS aud) AS auds_sum 
FROM MyTable; 
+-----+----------+ 
| chn | auds_sum | 
+-----+----------+ 
| 1 |  20 | 
| 2 |  45 | 
+-----+----------+ 

と(私はあなたがあなたの質問に基づいて欲しかったものだと思います)chn = 1chn = 2のためのペアごとの合計を計算している別:

WITH MyTable AS (
    SELECT 
    1 AS chn, 
    [2, 3, 4, 5, 6] AS auds 
    UNION ALL SELECT 
    2 AS chn, 
    [7, 8, 9, 10, 11] AS auds 
) 
SELECT 
    ARRAY(SELECT first_aud + second_auds[OFFSET(off)] 
     FROM UNNEST(first_auds) AS first_aud WITH OFFSET off) 
    AS summed_auds 
FROM (
    SELECT 
    (SELECT auds FROM MyTable WHERE chn = 1) AS first_auds, 
    (SELECT auds FROM MyTable WHERE chn = 2) AS second_auds 
); 
+---------------------+ 
| summed_auds  | 
+---------------------+ 
| [9, 11, 13, 15, 17] | 
+---------------------+ 

編集ここauds配列を超える金額を計算例です。 :すべての行にわたって対応する配列要素を合計するもう1つの例。これは特に効率的ではありませんが、意図した結果が得られるはずです。

WITH MyTable AS (
    SELECT 
    1 AS chn, 
    [2, 3, 4, 5, 6] AS auds 
    UNION ALL SELECT 
    2 AS chn, 
    [7, 8, 9, 10, 11] AS auds 
    UNION ALL SELECT 
    3 AS chn, 
    [-1, -6, 2, 3, 2] AS auds 
) 
SELECT 
    ARRAY(SELECT 
      (SELECT SUM(auds[OFFSET(off)]) FROM UNNEST(all_auds)) 
     FROM UNNEST(all_auds[OFFSET(0)].auds) WITH OFFSET off) 
    AS summed_auds 
FROM (
    SELECT 
    ARRAY_AGG(STRUCT(auds)) AS all_auds 
    FROM MyTable 
); 
+--------------------+ 
| summed_auds  | 
+--------------------+ 
| [8, 5, 15, 18, 19] | 
+--------------------+ 
+0

私はあなたに感謝したいと思うようです! 私は問題を2つの異なる 'chn'に単純化しましたが、この数値は変動しており、テーブルによっては450-500程度です。異なる数の異なるchnにソリューションを適合させる簡単な方法はありますか? – leodaily

+0

さて、あなたはこのポストの新しい例についてどう思いますか。これは、すべての行にわたって対応する配列要素を合計するだけです( 'chn'については何も仮定しません)。うまくいけば、あなたのユースケースのためにそれを適応させることができます。 –

0

ちょうどSUMと一緒にGROUP BYを使用しています。

SELECT SUM(auds), chn FROM [MyTable] GROUP BY chn 
+0

これは、 'chn = 1'と' chn = 2'のすべての1440 'auds'エントリを合計し、2行しか与えません。これは私が探しているものではありません。 私は '' auds''の配列を並列に合計しようとしています – leodaily

1

エリオットの答えは常に私にとってインスピレーションです!それはあなたのために動作するかどうか(それが必要:o)の投票と彼の答えを受け入れてください)
その間、それは少なく、複数のネストしない、配列などで満たされたので、私は、このオプションを好きScalar JS UDF

CREATE TEMPORARY FUNCTION mySUM(a ARRAY<INT64>, b ARRAY<INT64>) 
RETURNS ARRAY<INT64> 
LANGUAGE js AS """ 
    var sum = []; 
    for(var i = 0; i < a.length; i++){ 
    sum.push(parseInt(a[i]) + parseInt(b[i])); 
    } 
    return sum 
    """; 

WITH MyTable AS (
    SELECT 
    1 AS chn, 
    [2, 3, 4, 5, 6] AS auds 
    UNION ALL SELECT 
    2 AS chn, 
    [7, 8, 9, 10, 11] AS auds 
) 
SELECT 
    first_auds.chn AS first_auds_chn, 
    second_auds.chn AS second_auds_chn, 
    mySUM(first_auds.auds, second_auds.auds) AS summed_auds 
FROM MyTable AS first_auds 
JOIN MyTable AS second_auds 
ON first_auds.chn = 1 AND second_auds.chn = 2 

と代替オプションを追加したいですそれは読むのがはるかにクリーンです。

+0

エリオットの答えは、私の実際のテーブル/問題に適応するのがやや簡単なので、私は受け入れます。 大変ありがとうございます。 – leodaily

関連する問題