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 中设置用户的查询配额

如何从 BigQuery 下拉列表中绘制多个日期到 Google Data Studio

如何获取参数化 BigQuery 查询的控制台视图?