如何在Google BigQuery中为数千个类别创建虚拟变量列?

wub*_*000 4 mysql sql google-bigquery dummy-variable

我有一个包含两列的简单表:UserID和Category,每个UserID可以重复几个类别,如下所示:

UserID   Category
------   --------
1         A
1         B
2         C
3         A
3         C
3         B
Run Code Online (Sandbox Code Playgroud)

我想“虚拟化”该表:即创建一个输出表,该表的每个列都有由虚拟变量组成的唯一类别(0/1,取决于UserID是否属于该特定类别):

UserID    A  B  C
------    -- -- --
1         1  1  0
2         0  0  1
3         1  1  1
Run Code Online (Sandbox Code Playgroud)

我的问题是我有数千个类别(在此示例中不只是3个类别),因此无法使用CASE WHEN语句有效地完成此操作。

所以我的问题是:

1)有没有一种方法可以在不使用数千个CASE WHEN语句的情况下“虚拟化” Google BigQuery中的Category列。

2)这是UDF功能正常工作的情况吗?看起来确实是这样,但是我对BigQuery中的UDF不够了解,无法解决此问题。有人可以帮忙吗?

谢谢。

Mik*_*ant 5

您可以在“技术”下方使用

第一次运行查询1。它会生成您需要运行以获取所需结果的查询(查询2)。请,请先考虑Mosha的评论,然后再对成千上万的类别进行“疯狂”分析:

查询1:

SELECT 'select UserID, ' + 
   GROUP_CONCAT_UNQUOTED(
    'sum(if(category = "' + STRING(category) + '", 1, 0)) as ' + STRING(category)
   ) 
   + ' from YourTable group by UserID'
FROM (
  SELECT category 
  FROM YourTable  
  GROUP BY category
)
Run Code Online (Sandbox Code Playgroud)

结果将如下所示-查询#2

SELECT
  UserID,
  SUM(IF(category = "A", 1, 0)) AS A,
  SUM(IF(category = "B", 1, 0)) AS B,
  SUM(IF(category = "C", 1, 0)) AS C
FROM
  YourTable
GROUP BY
  UserID
Run Code Online (Sandbox Code Playgroud)

当然可以分为三类-您可以手动完成,但成千上万种绝对可以为您赚钱!

查询2的结果将与您预期的一样:

UserID  A   B   C    
1       1   1   0    
2       0   0   1    
3       1   1   1    
Run Code Online (Sandbox Code Playgroud)

  • 这正是我想要避免的 - 必须写数千行这样的行 - 无论是 CASE WHEN 还是 SUM IF! (2认同)
  • 再次阅读我的答案 - 您不需要手动编写它 - 只需运行 QUERY #1,它就会为您生成它! (2认同)