Bigquery/Standard SQL: 如何使用 sum() 聚合所有列(大约 100 列)?

Bigquery/Standard SQL: How can I aggregate all columns (about 100 columns) with sum()?

我正在寻找一种解决方案,以使用 sum() 函数聚合具有大约 100 列的 Bigquery table。但是 Bigquery 标准 SQL.

不允许以下查询
select sum(*)
from `dataset.Intermediate_Tables.eventCat_dummies`
group by Id

我想在 Bigquery 中进行这种聚合的原因是它能够处理大量数据。我试图在 jupyter notebook 中进行相同的聚合,但每次都失败了。这可能是因为数据量很大(7.3 GiB csv 文件)。我试过的代码如下:

df_type = type_dummies.groupby('Id', sort=False).sum()

任何人都可以就如何获取这个大型数据集的聚合数据提出任何建议 and/or 替代方案?

UPDATE WITH SAMPLE INPUT AND OUTPUT

输入数据

Id col1 col2 col3 col4
1  0    0    0    1
2  0    1    1    1
1  1    0    0    0
4  0    0    0    0
19 0    0    0    0
2  1    1    1    1

期望输出

Id col1_sum col2_sum col3_sum col4_sum
1  1        0        0        1
2  1        2        2        2
4  0        0        0        0
19 0        0        0        0

在我的原始数据集中,有 100 列和 4000 万行。

以下是 BigQuery StandardSQL 的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
  SELECT 1, 4, 5, 6 UNION ALL
  SELECT 2, 7, 8, 9
)
SELECT id, 
  SUM((
    SELECT SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64)) 
    FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}]', ''))) pair 
    WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
  )) val
FROM `project.dataset.table` t
GROUP BY id    

结果为

Row id  val  
1   1   21   
2   2   24     

如您所见 - 以上与列数无关
此外,它假定除 id 列之外的所有列都需要求和。如果你有更多的列要排除 - 你可以分别调整 WHERE 子句

Update based on provided details
So you want to sum each and every individual column (initially I read your question as if you want to sum all the column's values together by id)

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
  SELECT 1, 4, 5, 6 UNION ALL
  SELECT 2, 7, 8, 9
)
SELECT id, 
  REPLACE(SPLIT(pair, ':')[SAFE_OFFSET(0)], '"', '')  col,
  SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64)) val
FROM (
  SELECT id, 
    ARRAY(
      SELECT pair
      FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t1), r'[{}]', ''))) pair 
      WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
    ) arr
  FROM `project.dataset.table` t1
) t2,
UNNEST(arr) pair
GROUP BY id, col
ORDER BY id, col

这会给你下面的结果

Row id  col val  
1   1   a   5    
2   1   b   7    
3   1   c   9    
4   2   a   7    
5   2   b   8    
6   2   c   9    

此结果是您需要的扁平化版本,在大多数实际用例中比旋转版本更有效

不过,如果您想调整此结果 - 请参阅