将行转置为 BigQuery 中的列(数据透视实现)[重复]

Posted

技术标签:

【中文标题】将行转置为 BigQuery 中的列(数据透视实现)[重复]【英文标题】:Transpose rows into columns in BigQuery (Pivot implementation) [duplicate] 【发布时间】:2017-04-07 06:50:18 【问题描述】:

我想生成一个新表并使用 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 做到这一点?

【问题讨论】:

现在您可以拨打fhoffa.x.pivot(),详情请看这篇帖子:medium.com/@hoffa/easy-pivot-in-bigquery-one-step-5a1f13c6c710 【参考方案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  

请注意:如果您可以自己构建正确的查询(如第 2 步)并且字段数量小且恒定,或者如果是一次性交易,则可以跳过第 1 步。但第 1 步只是为您制作的辅助步骤,因此您可以随时快速创建它!

如果您有兴趣 - 您可以在我的其他帖子中查看有关旋转的更多信息。

How to scale Pivoting in BigQuery? 请注意 - 每个表有 10K 列的限制 - 因此您只能使用 10K 个组织。 您还可以将下面的示例视为简化示例(如果上面的示例过于复杂/冗长):How to transpose rows to columns with large amount of the data in BigQuery/SQL?How to create dummy variable columns for thousands of categories in Google BigQuery?Pivot Repeated fields in BigQuery

【讨论】:

注意:此 ianswer 适用于 BigQuery Legacy SQL!有关 BigQuery 标准 SQL 的版本,请参阅 ***.com/a/61530181/5221944 现在您可以拨打fhoffa.x.pivot(),详情请见本帖:medium.com/@hoffa/easy-pivot-in-bigquery-one-step-5a1f13c6c710

以上是关于将行转置为 BigQuery 中的列(数据透视实现)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用数据透视的情况下将行转换或转置为 SQL 中的列?

将行转置为具有条件的列[重复]

mysql 将行转置为列

将行转置为单列

Tsql 将行转置为列,按列分组

SQL 将行转置为列