移调BigQuery中的行转换成列(枢轴实现)移调BigQuery中的行转换成列(枢轴实现)(Tra

2019-05-12 02:42发布

我要生成一个新表,把所有键值对与键作为列名和值作为使用的BigQuery各自的价值。

例:

**Key**                  **Value**
channel_title           Mahendra Guru    
youtube_id              ugEGMG4-MdA  
channel_id              UCiDKcjKocimAO1tV    
examId                  72975611-4a5e-11e5   
postId                  1189e340-b08f 

channel_title           Ab Live  
youtube_id              3TNbtTwLY0U  
channel_id              UCODeKM_D6JLf8jJt    
examId                  72975611-4a5e-11e5   
postId                  0c3e6590-afeb

我想将其转换为:

**channel_title   youtube_id   channel_id         examId               postId**
Mahendra Guru   ugEGMG4-MdA  UCiDKcjKocimAO1tV  72975611-4a5e-11e5   1189e340-b08f
Ab Live         3TNbtTwLY0U  UCODeKM_D6JLf8jJt  72975611-4a5e-11e5   0c3e6590-afeb

如何使用的BigQuery办呢?

Answer 1:

BigQuery的尚不支持旋转功能
您仍然可以在BigQuery中使用下面的方法做到这一点

但首先,除了在输入数据的两列,你必须将输入指定行组一个多列,需要组合成在输出一行

所以,我想你的输入表(yourTable)看起来像下面

**id**  **Key**                  **Value**
   1    channel_title           Mahendra Guru    
   1    youtube_id              ugEGMG4-MdA  
   1    channel_id              UCiDKcjKocimAO1tV    
   1    examId                  72975611-4a5e-11e5   
   1    postId                  1189e340-b08f 

   2    channel_title           Ab Live  
   2    youtube_id              3TNbtTwLY0U  
   2    channel_id              UCODeKM_D6JLf8jJt    
   2    examId                  72975611-4a5e-11e5   
   2    postId                  0c3e6590-afeb  

所以,首先你应该运行下面的查询

SELECT 'SELECT id, ' + 
   GROUP_CONCAT_UNQUOTED(
      'MAX(IF(key = "' + key + '", value, NULL)) as [' + key + ']'
   ) 
   + ' FROM yourTable GROUP BY id ORDER BY id'
FROM (
  SELECT key 
  FROM yourTable
  GROUP BY key
  ORDER BY key
) 

上述查询的结果将是字符串(如格式化)看起来像下面

SELECT 
  id, 
  MAX(IF(key = "channel_id", value, NULL)) AS [channel_id],
  MAX(IF(key = "channel_title", value, NULL)) AS [channel_title],
  MAX(IF(key = "examId", value, NULL)) AS [examId],
  MAX(IF(key = "postId", value, NULL)) AS [postId],
  MAX(IF(key = "youtube_id", value, NULL)) AS [youtube_id] 
FROM yourTable 
GROUP BY id 
ORDER BY id

你现在应该复制上述结果(注:你并不真的需要格式化它 - 我做到了只呈现),并运行它作为普通查询

结果将是,你会预期

id  channel_id          channel_title   examId              postId          youtube_id   
1   UCiDKcjKocimAO1tV   Mahendra Guru   72975611-4a5e-11e5  1189e340-b08f   ugEGMG4-MdA  
2   UCODeKM_D6JLf8jJt   Ab Live         72975611-4a5e-11e5  0c3e6590-afeb   3TNbtTwLY0U  

请注意:您可以跳过步骤1,如果你可以自己和领域小,不断的数目构建适当的查询(如步骤2),或者如果它是一个时间的交易。 但第1步只是辅助性的步骤,使得它适合你,这样你就可以创建它快速的任何时间!

如果你有兴趣 - 你可以看到更多关于我的其他职位旋转。

如何扩大枢转BigQuery中?
请注意 - 有每个表的10K列的限制 - 所以你用10K组织的限制。
还可以看到下面作为简化的例子(如果一个以上是太复杂/详细):
如何转置行与列大量BigQuery中/ SQL中的数据?
如何创建虚拟变量列数千谷歌的BigQuery类的?
BigQuery中枢轴重复场



文章来源: Transpose rows into columns in BigQuery (Pivot implementation)