Google BigQuery:如何查询两个不同值之间的共享值计数?
Posted
技术标签:
【中文标题】Google BigQuery:如何查询两个不同值之间的共享值计数?【英文标题】:Google BigQuery: How to query the count of shared values between two different values? 【发布时间】:2019-10-29 14:24:23 【问题描述】:我正在处理一些简报数据,并试图显示注册多个简报的用户数量(列表之间的用户重叠)。我在 Google BigQuery 和 DataStudio 中使用时事通讯数据进行可视化。
我的数据集为每个用户 + 简报组合返回一行。因此,如果用户注册了三个不同的时事通讯,它将显示:
+---+------------+--------------+
| | Name | Newsletter |
+---+------------+--------------+
| 1 | User A | Newsletter 1 |
| 2 | User A | Newsletter 2 |
| 3 | User A | Newsletter 3 |
+---+------------+--------------+
我将重叠组合输入限制为 2。
我的问题是:我将如何查询我的原始数据集以返回所有可能组合的重叠用户数?我确定有一些方法可以使用各种 CASE 语句来完成,但这似乎乏味且效率低下。想知道是否有一种我没有想到的更简单的方法。
关于我如何考虑可视化的更多背景信息,这会影响结果:
因为我将每个组合限制为 2 个时事通讯,所以我认为热图可能是尝试显示这些数据的好方法,其中每个“交叉点”中两个列表上的用户数量。
但为了在 DataStudio 中执行此操作,我需要数据以如下格式显示:
这就像 CROSS JOIN 的结果,所有不同的组合都在 A 列和 B 列中表示。因此存在重叠,但这是可视化它的必要设置(至少这是我认为的唯一方法这是可行的)。
所以如果我要使用这个特定的方法,我将如何查询我的数据集以这种格式返回它?
也对如何思考/想象这种特殊情况的其他想法持开放态度,但想提出我的具体问题。
【问题讨论】:
【参考方案1】:看起来您正在寻找以下内容
#standardSQL
SELECT A, B, IFNULL(`Count`, 0) AS `Count`
FROM (
SELECT DISTINCT t1.Newsletter AS A, t2.Newsletter AS B
FROM `project.dataset.table` t1, `project.dataset.table` t2
) LEFT JOIN (
SELECT t1.Newsletter AS A, t2.Newsletter AS B, COUNT(1) AS `Count`
FROM `project.dataset.table` t1, `project.dataset.table` t2
WHERE t1.Name = t2.Name AND t1.Newsletter != t2.Newsletter
GROUP BY A, B
) USING (A, B)
【讨论】:
以上是关于Google BigQuery:如何查询两个不同值之间的共享值计数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Google BigQuery Composer和Cloud Shell中提交多个查询
Pyspark 和 BigQuery 在 Google Dataproc 中使用两个不同的项目 ID
Youtube Data Studio,如何从两个不同的数据源(例如两个 BigQuery 表)创建计算字段
如何在 Google BigQuery 中设置用户的查询配额