将行转置为 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 中的列(数据透视实现)[重复]的主要内容,如果未能解决你的问题,请参考以下文章