BigQuery计算值与多列之间的重叠百分比 [英] BigQuery Calculating Percent Overlap Between Values Multiple Columns

查看:35
本文介绍了BigQuery计算值与多列之间的重叠百分比的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对SQL和BigQuery相当陌生,现在正在处理一个大约有140万行的数据集。

我当前感兴趣的值是CATEGORY_NAME(字符串)、ITEM_ID(字符串)。我感兴趣的是计算CATEGORY_NAME中每个值的不同Item_id(此列总共有269个不同的值)。基本上,在我的基本数据集中,每行数据都包含一个Item_id实例,其中它显示在单个CATEGORY_NAME中,其中Item_ID每天可以有多行,具体取决于当天出现的CATEGORY_NAMES的数量。

我已经成功地运行了一个查询,为CATEGORY_NAME的每个值添加了一个不同的Item_id的新列,现在的最终输出应该是我不知道该怎么做,那就是计算1个CATEGORY_NAME中也出现在其他CATEGORY_NAME中的DISTINCT ITEM_ID的百分比。因此,基本上我在寻找一个新列(如透视表),该列将计算2个CATEGORY_NAME的匹配的Item_ID,然后将该计数除以1个CATEGORY_NAME中不同的Item_id的总数。因此,基本上每个CATEGORY_NAME都有269个新列,每一行都表示基本CATEGORY_NAME与其他CATEGORY_NAME的重叠百分比。

这是我的表中当前我感兴趣的数据

category_name  |   item_id
---------------|------------
category1      |  item1
category2      |  item1
category3      |  item1
category1      |  item2
category4      |  item2
category1      |  item3
category5      |  item3
category5      |  item2
category6      |  item4
category3      |  item5
category3      |  item6
category1      |  item6
category2      |  item5
category1      |  item4

以下是我当前的查询结果

category_name  |  distinct_items
---------------|-----------------
category1      |  5
category2      |  2
category3      |  3
category4      |  1
category5      |  2
category6      |  1

以下是我希望最终输出是什么样子:

category_name  | category1   |  category2  |   category3   |   category4   |  category5  |  category6
--------------------------------------------------------------------------------------------------------
category1      |   100%      |     20%     |      40%      |      20%      |     40%     |     20%
category2      |    50%      |     100%    |      100%     |       0%      |      0%     |     0%
category3      |    66.67%   |     66.67%  |      100%     |       0%      |      0%     |     0%
category4      |   100%      |      0%     |       0%      |      100%     |     100%    |     0%
category5      |   100%      |      0%     |       0%      |       50%     |     100%    |     0%
category6      |   100%      |      0%     |       0%      |       0%      |      0%     |    100%
本质上,CATEGORY_NAME的行值是当该CATEGORY_NAME为目标时,将它们的DISTINCT_ITEMS总数与其他CATEGORY_NAMES进行比较,并根据Item_ID查找匹配/DISTINCT_ITEMS总数的百分比。如果有另一种方法可以在不使用数据透视表的情况下获得此输出,这也将是非常值得赞赏的。并且上下文有269个CATEGORY_NAMES和6525个不同的ITEM_ID。

如果我可以在Google data studio中使用一个更简单的公式来进行这个聚合,那么这个公式也会很有效,因为data studio中的最终输出应该是带有x轴和y轴的散点图,CATEGORY_NAMES和气泡是%重叠,所以本质上只是用散点图可视化数据透视表结果。如果我的描述和问题中有任何地方没有意义,或者需要更清楚,请随时给我贴标签,让我知道什么是令人困惑的。如有任何帮助,我们将不胜感激!谢谢

推荐答案

下面是BigQuery Standard SQL

第1步-动态生成查询文本,因此您无需手动输入全部269个类别.

#standardSQL
SELECT '''SELECT category_name, ''' || 
  STRING_AGG(DISTINCT
    ' MAX(IF(category_name2 = "' || category_name || '", percent, NULL)) AS ' || category_name
  ) || '''
FROM (
  SELECT t1.category_name, t2.category_name category_name2,
    ROUND(100 * COUNTIF(t1.item_id = t2.item_id) / COUNT(DISTINCT t1.item_id), 2) percent
  FROM `project.dataset.table` t1 
  CROSS JOIN `project.dataset.table` t2
  GROUP BY t1.category_name, t2.category_name
)
GROUP BY category_name
'''
FROM `project.dataset.table`

如果您针对问题中的示例数据运行上述查询,您将获得以下查询的平面化版本

SELECT category_name, 
  MAX(IF(category_name2 = "category1", percent, NULL)) AS category1, 
  MAX(IF(category_name2 = "category2", percent, NULL)) AS category2, 
  MAX(IF(category_name2 = "category3", percent, NULL)) AS category3, 
  MAX(IF(category_name2 = "category4", percent, NULL)) AS category4, 
  MAX(IF(category_name2 = "category5", percent, NULL)) AS category5, 
  MAX(IF(category_name2 = "category6", percent, NULL)) AS category6 
FROM ( 
  SELECT t1.category_name, t2.category_name category_name2, 
  ROUND(100 * COUNTIF(t1.item_id = t2.item_id) / COUNT(DISTINCT t1.item_id), 2) percent 
  FROM `project.dataset.table` t1 
  CROSS JOIN `project.dataset.table` t2 
  GROUP BY t1.category_name, t2.category_name 
) 
GROUP BY category_name   

第二步-复制第一步中的查询结果并将其作为查询运行-就这样!

如果要将此应用于问题中的样本数据-输出将为

Row category_name   category1   category2   category3   category4   category5   category6    
1   category1       100.0       20.0        40.0        20.0        40.0        20.0     
2   category2       50.0        100.0       100.0       0.0         0.0         0.0  
3   category3       66.67       66.67       100.0       0.0         0.0         0.0  
4   category4       100.0       0.0         0.0         100.0       100.0       0.0  
5   category5       100.0       0.0         0.0         50.0        100.0       0.0  
6   category6       100.0       0.0         0.0         0.0         0.0         100.0         
注意1:您可以使用您选择的任何客户端自动执行上述整个流程
注2:在您的简化示例中,我主要使用的是数据。在您的实际案例中,您可能需要一些细微的调整-如果您对此有任何问题-请发布新问题

这篇关于BigQuery计算值与多列之间的重叠百分比的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆