字符串聚合,在大查询中创建数据透视列。

问题描述 投票:0回答:1

我正试图实现下面链接的这个确切的解决方案,但似乎GROUP_CONCAT_UNQUOTED不再是一个有效的BQ函数。 有没有在2020年能用的解决方案?

p.s.我本来只想在原帖上发表评论,但显然我的声誉还不够高......

在BigQuery中把行转置成列(Pivot的实现方式

google-bigquery pivot string-function
1个回答
3
投票

下面的例子是针对BigQuery标准SQL的

假设你有以下数据

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, 'channel_title' key, 'Mahendra Guru' value UNION ALL
  SELECT 1, 'youtube_id', 'ugEGMG4-MdA' UNION ALL
  SELECT 1, 'channel_id', 'UCiDKcjKocimAO1tV' UNION ALL
  SELECT 1, 'examId', '72975611-4a5e-11e5' UNION ALL
  SELECT 1, 'postId', '1189e340-b08f' UNION ALL

  SELECT 2, 'channel_title', 'Ab Live' UNION ALL
  SELECT 2, 'youtube_id', '3TNbtTwLY0U' UNION ALL
  SELECT 2, 'channel_id', 'UCODeKM_D6JLf8jJt' UNION ALL
  SELECT 2, 'examId', '72975611-4a5e-11e5' UNION ALL
  SELECT 2, 'postId', '0c3e6590-afeb' 
)   

获取这些键的枢轴 - 你可以使用下面的查询方式。

#standardSQL
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 `project.dataset.table` 
GROUP BY id 

结果

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

为了让你的生活更简单,而不是为每个键都输入所有这些行--你可以使用下面的查询来生成整个SQL文本。

#standardSQL
SELECT 'SELECT id, ' || 
   STRING_AGG(
      'MAX(IF(key = "' || key || '", value, NULL)) as `' || key || '`'
   ) 
   || ' FROM `project.dataset.table` GROUP BY id ORDER BY id'
FROM (
  SELECT key 
  FROM `project.dataset.table`
  GROUP BY key
  ORDER BY key
)        

注意:你问题中提到的帖子是2016年给出的,而且是针对Legacy SQL的。

© www.soinside.com 2019 - 2024. All rights reserved.