在BigQuery中对多列进行求和

时间:2018-02-20 16:19:44

标签: sql google-bigquery

我有一个查询返回许多列,这些列是1或0,具体取决于用户与网站的许多点的交互,我的数据如下所示:

UserID   Variable_1   Variable_2   Variable_3   Variable_4   Variable_5
User 1        1           0             1            0           0
User 2        0           0             1            0           0
User 3        0           0             0            0           1
User 4        0           1             1            1           1
User 5        1           0             0            0           1

每个变量都使用它自己的代码行来定义,例如: MAX(IF(LOWER(hits_product.productbrand) LIKE "Variable_1",1,0)) AS Variable_1,

我希望有一个列可以汇总每个用户的所有行数。看起来像这样:

UserID   Total     Variable_1   Variable_2   Variable_3   Variable_4   Variable_5
User 1     2             1           0             1            0           0
User 2     3             1           1             1            0           0
User 3     0             0           0             0            0           0
User 4     5             1           1             1            1           1
User 5     3             1           0             1            0           1

实现这一目标最优雅的方法是什么?

3 个答案:

答案 0 :(得分:3)

即使发生这种情况,对于OP的特殊情况,简单的COUNT(DISTINCT)就足够了 - 我仍然想回答原始问题,即如何将所有数字列总结为一个Total而不依赖于这些列的数量和名称

以下是BigQuery Standard SQL

#standardSQL
SELECT 
  UserID,   
  ( SELECT SUM(CAST(value AS INT64)) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r':(\d+),?')) value
  ) Total,
  * EXCEPT(UserID)
FROM t

可以使用问题

中的虚拟数据来测试/播放
#standardSQL
WITH t AS (
  SELECT 'User 1' UserID, 1 Variable_1, 0 Variable_2, 1 Variable_3, 0 Variable_4, 0 Variable_5 UNION ALL
  SELECT 'User 2', 1, 1, 1, 0, 0 UNION ALL
  SELECT 'User 3', 0, 0, 0, 0, 0 UNION ALL
  SELECT 'User 4', 1, 1, 1, 1, 1 UNION ALL
  SELECT 'User 5', 1, 0, 1, 0, 1 
)
SELECT 
  UserID,   
  ( SELECT SUM(CAST(value AS INT64)) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r':(\d+),?')) value
  ) Total,
  * EXCEPT(UserID)
FROM t
ORDER BY UserID   

结果是

Row UserID      Total   Variable_1  Variable_2  Variable_3  Variable_4  Variable_5   
1   User 1      2       1           0           1           0           0    
2   User 2      3       1           1           1           0           0    
3   User 3      0       0           0           0           0           0    
4   User 4      5       1           1           1           1           1    
5   User 5      3       1           0           1           0           1    

答案 1 :(得分:1)

一个简单的方法使用子查询或CTE:

select t.*, (v1 + v2 + v3 . . . ) as total
from (<your query here>
     ) t;

不知道数据是什么样的,很有可能count(distinct hits_product.productbrand)也可以做到这一点。

答案 2 :(得分:0)

如何将多个变量列定义到KeyValue消息的一个重复“变量”列中,其中一个键是您的变量名称并且值为数字,它可以大大简化您的计算。