【问题标题】:How to find overlap between groups in Big query SQL如何在大查询 SQL 中查找组之间的重叠
【发布时间】:2021-04-21 22:46:32
【问题描述】:

我有以下数据集:

| user_id | Campaingid| <br>
| 1       | campaign1|  <br>
| 1       | campaign2| <br>
| 2       | campaign1| <br>
| 1       | campaign3| <br>
| 3       | campaign5| <br>
| 3       | campaign2|<br>
| 3       | campaign3|<br>
| 4       | campaign6| <br>
| 5       | campiagn5| <br>

我正在尝试查找活动中 user_id 的重叠,换句话说,活动 1 中有多少人也参加了活动 2:

我可以通过在广告系列 ID 上使用一个组来找到每个广告系列中的不同用户,但我需要有关不同广告系列之间重叠的帮助:我试图实现的结果可以用下面的矩阵来演示:

Campaign ID| 1 | 2 | 3 | 4| 5| 6| <br>
1 <br>
2 <br>
3 <br>
4 <br>

对角线只代表campaign1中的人,campaign1-campaign2是campaign1和campaign2中的人。

有没有办法在 SQL (Bigquery) 中做到这一点。 谢谢

【问题讨论】:

    标签: sql google-bigquery gaps-and-islands date-arithmetic


    【解决方案1】:

    这更简单地生成为三列:

    • campaignid1
    • campaignid2
    • 用户数

    为此,您可以使用自联接和聚合:

    select d1.campaignid, d2.campaignid, count(*)
    from dataset d1 join
         dataset d2
         on d1.userid = d2.userid
    group by d1.campaignid, d2.campaignid;
    

    您可以调整这些结果,但这需要了解广告系列:

    select d1.campaignid,
           countif(d2.campaignid = 1) as campaign_1,
           countif(d2.campaignid = 2) as campaign_2,
           countif(d2.campaignid = 3) as campaign_3,
           countif(d2.campaignid = 4) as campaign_4,
           countif(d2.campaignid = 5) as campaign_5
    from dataset d1 join
         dataset d2
         on d1.userid = d2.userid
    group by d1.campaignid;
    

    【讨论】:

    • 我能够生成数据透视表,我在第一个查询中使用了 count(distinct id)。生成矩阵后。如果我将应该等于不同 ID 的全局计数的对角元素相加,对吗?原始的不同 user_id 计数约为 3900 万。但是当我添加对角线元素时,我得到了大约 5900 万。你能帮我解释一下为什么会这样吗?
    • 多个用户在一个或多个广告系列中 - 您有重复。如果您不想对此进行调查,可以使用count(distinct userid)
    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多