leo*_*ily 4 sql google-bigquery
我会尽力尽可能清楚地解释我的问题,如果不是,请告诉我。
我有一个[MyTable]看起来像这样的表:
----------------------------------------
|chn:integer | auds:integer (repeated) |
----------------------------------------
|1 |3916 |
|1 |4983 |
|1 |6233 |
|1 |1214 |
|2 |1200 |
|2 |900 |
|2 |2030 |
|2 |2345 |
----------------------------------------
Run Code Online (Sandbox Code Playgroud)
Auds总是重复 4 次。
如果我查询SELECT chn, auds FROM [MyTable] WHERE chn = 1,我会得到以下结果:
-------------------
|Row | chn | auds |
-------------------
|1 |1 |3916 |
|2 |1 |4983 |
|3 |1 |6233 |
|4 |1 |1214 |
-------------------
Run Code Online (Sandbox Code Playgroud)
如果我查询SELECT chn, auds FROM [MyTable] WHERE (chn = 1 OR chn = 2),我会得到以下结果:
-------------------
|Row | chn | auds |
-------------------
|1 |1 |1200 |
|2 |1 |900 |
|3 |1 |2030 |
|4 |2 |2345 |
-------------------
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,我得到了两倍的结果,但我想要得到的是和的SUM()重复字段,或者视觉上,如下所示:audschn = 1chn = 2
-------------------
|Row | chn | auds |
-------------------
|1 |3 |5116 |
|2 |3 |5883 |
|3 |3 |8263 |
|4 |3 |3559 |
-------------------
Run Code Online (Sandbox Code Playgroud)
我尝试做某事:
SELECT a1+a2 FROM
(SELECT auds AS a1 FROM [MyTable] WHERE chn = 1),
(SELECT auds AS a2 FROM [MyTable] WHERE chn = 2)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
Error: Cannot query the cross product of repeated fields a1 and a2.
Run Code Online (Sandbox Code Playgroud)
使用标准 SQL表达此类逻辑要容易得多(取消选中“显示选项”下的“使用旧版 SQL”)。下面是计算数组总和的示例auds:
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 |
+-----+----------+
Run Code Online (Sandbox Code Playgroud)
另一个计算 和 的成对总和chn = 1(chn = 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] |
+---------------------+
Run Code Online (Sandbox Code Playgroud)
编辑:另一个示例,对所有行中相应的数组元素进行求和。这可能不会特别有效,但它应该会产生预期的结果:
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] |
+--------------------+
Run Code Online (Sandbox Code Playgroud)