は、私は2つのテーブルがあると仮定:intervals
インデックス間隔を含み(その列がi_min
とi_max
ある)とvalues
は(列i
とx
有する)インデックス付き値を含みます。ここでは例です:BigQueryの/ SQL:二次表で示された間隔にわたる和
values: intervals:
+---+---+ +-------+-------+
| i | x | | i_min | i_max |
+-------+ +---------------+
| 1 | 1 | | 1 | 4 |
| 2 | 0 | | 6 | 6 |
| 3 | 4 | | 6 | 6 |
| 4 | 9 | | 6 | 6 |
| 6 | 7 | | 7 | 9 |
| 7 | 2 | | 12 | 17 |
| 8 | 2 | +-------+-------+
| 9 | 2 |
+---+---+
私は各区間について、xの値を合計する:いくつかのSQLエンジンで
result:
+-------+-------+-----+
| i_min | i_max | sum |
+---------------------+
| 1 | 4 | 13 | // 1+0+4+9
| 6 | 6 | 7 |
| 6 | 6 | 7 |
| 6 | 6 | 7 |
| 7 | 9 | 6 | // 2+2+2
| 12 | 17 | 0 |
+-------+-------+-----+
、これは使用して行うことができます
ことを除いてSELECT
i_min,
i_max,
(SELECT SUM(x)
FROM values
WHERE i BETWEEN intervals.i_min AND intervals.i_max) AS sum_x
FROM
intervals
BigQueryではクエリの型が許可されていません(「SELECT句ではSubselectが許可されていません」または「LEFT OUTER JOINは結合の両側からのフィールドが等しい条件なしでは使用できません) xを使用)。
ウィンドウ関数でこれを行う方法があるに違いありませんが、私はどのように理解できません - 私が見たすべての例では、テーブルの一部としてパーティションがあります。 CROSS JOINを使用しないオプションはありますか?そうでない場合、このクロスジョインを行う最も効率的な方法は何ですか?
私のデータに関する注意:
- 両方のテーブルには、多くの(10⁸-10⁹)行が含まれています。
intervals
には繰り返しがあり、i
にはないことがあります。- しかし、
intervals
の2つのインターバルは、どちらも同じで、完全に重ならない(重複しない)かどちらかです。 - すべての間隔の和集合は、通常、すべての値の集合の近くにあります(したがって、この空間のパーティションを形成します)。
i
- 間隔が大きい場合があります(たとえば、i_max-i_min < 106)。
以下のようにダミーデータで/テストを再生することができ、あなたの質問を編集して、サンプルデータと望ましい結果を提供してください。また、間隔が重複していて、コンパクトで、スパースであるかどうかについても説明します。 。 。ソリューションに影響する可能性があります。 –
クエリでこの種の機能を使用するには、[標準SQLを有効にする](https://cloud.google.com/bigquery/docs/reference/standard-sql/)を必ず確認してください。 [移行ガイド](https://cloud.google.com/bigquery/docs/reference/standard-sql/migrating-from-legacy-sql)も参照してください。 –
@GordonLinoff良い点、しました。 – Ted