假設指示間隔I有兩個表:intervals
包含索引間隔(其列是i_min
和i_max
)和values
包含索引值(的列i
和x
)。這裏有一個例子:大量查詢/ 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的值,每個間隔:
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
不同之處在於:
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 |
+-------+-------+-----+
在一些SQL引擎,這可以用做BigQuery不允許使用查詢類型(「在SELECT子句中不允許使用子選擇」或「如果沒有條件等於來自連接兩邊的字段的條件,則不能使用」LEFT OUTER JOIN「」取決於synta x使用)。
必須有一種方法可以用窗口函數做到這一點,但我無法弄清楚 - 我看過的所有例子都將分區作爲表的一部分。有沒有不使用CROSS JOIN的選項?如果沒有,做這個CROSS JOIN最有效的方法是什麼?
我的數據的一些注意事項:
- 這兩個表包含許多(10⁸-10⁹)行。
intervals
中可能有重複,而不是i
。- 但
intervals
中的兩個區間要麼相同,要麼完全不相交(不重疊)。 - 所有間隔的並集通常接近所有值的集合(所以它形成這個空間的一個分區)。
- 間隔可能很大(例如,i_max-i_min <10⁶)。
請編輯您的問題,並提供樣本數據和預期的結果。還要說明間隔是否重疊,緊湊,稀疏。 。 。這可能會影響解決方案。 –
請確保[啓用標準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