用于在 Bigquery 中创建数据透视列的字符串聚合
String Aggregtion to create pivot columns in Big Query
我正在尝试实施下面链接的这个确切的解决方案,但似乎 GROUP_CONCAT_UNQUOTED 不再是有效的 BQ 函数。有没有在 2020 年行之有效的解决方案?
p.s。我本来想评论原版的 post,但显然我的声誉还不够高...
以下示例适用于 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
)
注意:您在问题中提到的 post 是在 2016 年为 Legacy SQL
提供的
我正在尝试实施下面链接的这个确切的解决方案,但似乎 GROUP_CONCAT_UNQUOTED 不再是有效的 BQ 函数。有没有在 2020 年行之有效的解决方案?
p.s。我本来想评论原版的 post,但显然我的声誉还不够高...
以下示例适用于 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
)
注意:您在问题中提到的 post 是在 2016 年为 Legacy SQL
提供的