在 BigQuery 中将行转置为列

Posted

技术标签:

【中文标题】在 BigQuery 中将行转置为列【英文标题】:Transpose rows into columns in BigQuery 【发布时间】:2017-11-28 16:57:59 【问题描述】:

您好 BigQuery 社区!

我在 BigQuery 中有下表:Table1: Output Table BigQuery

现在我想将它转换成这种格式: Table2: Transpose Table BigQuery

您还可以在此 Google 表格中查看表格:https://docs.google.com/spreadsheets/d/1LF8OMql3BdBAReUX33Y2f3QMD2EW6Exw5hBOFm7EteU/edit?usp=sharing

挑战在于:实体总是不同的,每个 search_term 最多可以包含 X 个实体。我真的不知道从哪里开始。如果有人可以帮助我,那就太好了。我对每一次帮助感到非常高兴。

非常感谢!

【问题讨论】:

请将输入/预期输出与您的问题内联,最好是格式化文本而不是图像。 【参考方案1】:

我真的不知道从哪里开始

下面可能是你的好开始

#standardSQL
WITH `project.dataset.table1` AS (
  SELECT 'van rental london' search_term, 'Rental' entity, 'rental' entitydetail, 3 enittyCount UNION ALL
  SELECT 'van rental london', 'Location', 'london', 3 UNION ALL
  SELECT 'van rental london', 'Car Type', 'van', 3 UNION ALL
  SELECT 'van hire sheffield', 'Location', 'sheffield', 3 UNION ALL
  SELECT 'van hire sheffield', 'Car Type', 'van', 3 UNION ALL
  SELECT 'van hire sheffield', 'Hire', 'hire', 3 UNION ALL
  SELECT 'van hire', 'Car Type', 'van', 2 UNION ALL
  SELECT 'van hire', 'Hire', 'hire', 2 UNION ALL
  SELECT 'san diego car rental', 'Rental', 'rental', 3 UNION ALL
  SELECT 'san diego car rental', 'Location', 'San Diego', 3 UNION ALL
  SELECT 'san diego car rental', 'Vehicle Type', 'car', 3 UNION ALL
  SELECT 'long term car rental london', 'Vehicle Type', 'car', 4 UNION ALL
  SELECT 'long term car rental london', 'Location', 'london', 4 UNION ALL
  SELECT 'long term car rental london', 'Rental', 'rental', 4 UNION ALL
  SELECT 'long term car rental london', 'Long Term', 'Long Term', 4 UNION ALL
  SELECT 'london car hire', 'Location', 'london', 3 UNION ALL
  SELECT 'london car hire', 'Vehicle Type', 'car', 3 UNION ALL
  SELECT 'london car hire', 'Hire', 'hire', 3 
)
SELECT
  search_term,
  MAX(IF(pos=1, entity, NULL)) entity1, 
  MAX(IF(pos=1, entitydetail, NULL)) entitydetail1, 
  MAX(IF(pos=2, entity, NULL)) entity2, 
  MAX(IF(pos=2, entitydetail, NULL)) entitydetail2, 
  MAX(IF(pos=3, entity, NULL)) entity3, 
  MAX(IF(pos=3, entitydetail, NULL)) entitydetail3, 
  MAX(IF(pos=4, entity, NULL)) entity4, 
  MAX(IF(pos=4, entitydetail, NULL)) entitydetail4 
FROM (
  SELECT 
    search_term, entity, entitydetail, 
    ROW_NUMBER() OVER(PARTITION BY search_term ORDER BY entity) pos
  FROM `project.dataset.table1`
)
GROUP BY search_term

每个 search_term 最多可以包含 X 个实体

以上查询假设您知道 X 的最大值,因此您需要在查询中重复以下两行 X 次,将 N 替换为相应的数字

  MAX(IF(pos=N, entity, NULL)) entityN, 
  MAX(IF(pos=N, entitydetail, NULL)) entitydetailN, 

当然,这可以使用脚本轻松生成(您可以使用 BQ 或您选择的任何语言)

您也可以查看https://***.com/a/40766540/5221944 了解更多信息

【讨论】:

非常感谢,再次感谢您的帮助。完美运行:-)

以上是关于在 BigQuery 中将行转置为列的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark SQL (pyspark) 中将行转置为列

mysql 将行转置为列

SQL 将行转置为列

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

SQL Server JSON 将行转置为列

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列