11

我有一个包含 2 列的简单表:用户 ID 和类别,每个用户 ID 可以重复几个类别,如下所示:

UserID   Category
------   --------
1         A
1         B
2         C
3         A
3         C
3         B

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

UserID    A  B  C
------    -- -- --
1         1  1  0
2         0  0  1
3         1  1  1

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

所以我的问题是:

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

2) 这是 UDF 功能运行良好的情况吗?似乎是这样,但我对 BigQuery 中的 UDF 不够熟悉,无法解决这个问题。有人可以帮忙吗?

谢谢。

4

1 回答 1

9

您可以使用下面的“技术”

首先运行查询 #1。它产生您需要运行以获得所需结果的查询(查询#2)。请在使用数千个类别“狂野”之前仍然考虑 Mosha 的评论 :o)

查询 #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
)

结果将如下所示 - 查询 #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

当然对于三个类别-您可以手动完成,但是对于成千上万的人来说,它绝对会让您开心!!

查询 #2 的结果将如您所料:

UserID  A   B   C    
1       1   1   0    
2       0   0   1    
3       1   1   1    
于 2015-12-01T00:55:42.353 回答