我有一个查询返回许多列,这些列是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
实现这一目标最优雅的方法是什么?
答案 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消息的一个重复“变量”列中,其中一个键是您的变量名称并且值为数字,它可以大大简化您的计算。