Google BigQuery:如何查询两个不同值之间的共享值计数?

时间:2019-10-29 14:24:23

标签: google-bigquery google-data-studio

我正在处理一些新闻通讯数据,并且试图显示已注册多个新闻通讯的用户数量(列表之间的用户重叠)。我正在使用Google BigQuery和DataStudio中的新闻通讯数据进行可视化。

我的数据集为每个用户+新闻稿组合返回一行。因此,如果用户注册了三个不同的新闻通讯,它将显示:

+---+------------+--------------+
|   | Name       |  Newsletter  |
+---+------------+--------------+
| 1 | User A     | Newsletter 1 |
| 2 | User A     | Newsletter 2 |
| 3 | User A     | Newsletter 3 |
+---+------------+--------------+

我将输入的重叠组合限制为2个。

我的问题是我如何查询我的原始数据集以返回所有可能组合的重叠用户数?我确定有某种方法可以使用各种CASE语句执行此操作,但这似乎很乏味且效率低下。想知道是否有我没有想到的更简单的方法。

有关我如何可视化的更多背景信息,这会影响结果:

因为我将每个组合限制为2个新闻通讯,所以我认为热图可能是尝试显示此数据的好方法,因为每个“交叉点”的两个列表中都有用户数量。 enter image description here

但是为了在DataStudio中执行此操作,我需要数据以如下格式显示: enter image description here

这就像CROSS JOIN的结果,所有不同的组合都在A列和B列中表示。因此存在重叠,但这是可视化它的必要设置(至少这是我认为的唯一方法这是可行的)。

因此,如果我要使用这种特定方法,我将如何查询我的数据集以这种格式返回它?

也对其他有关如何思考/可视化这种特殊情况的想法持开放态度,但想提出我的特定问题。

1 个答案:

答案 0 :(得分: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)