Big Query 或 SQL 重塑数据

Posted

技术标签:

【中文标题】Big Query 或 SQL 重塑数据【英文标题】:Big Query or SQL reshape data 【发布时间】:2016-04-17 15:23:28 【问题描述】:

我使用 bigquery 存储数据 例如我有桌子

userId|event  |count
------------- |
1     |event1 |1
1     |event2 |2
2     |event1 |2
2     |event2 |1 
2     |event3 |4 
3     |event1 |3 
4     |event3 |5 
4     |event4 |5 

我怎样才能得到这张表?(关于列事件索引计数总和) 仅使用 BigQuery(或 SQL)能力

userId|event1 |event2|event3|event4
----------------------------------
1     |1      |2     |0     |0    |
2     |2      |1     |4     |0    |
3     |0      |0     |0     |0    |
4     |0      |0     |5     |5    |

【问题讨论】:

How to Pivot table in Big Query的可能重复 例如,我有 50 个独特的事件。你能展示一下查询的外观吗? 【参考方案1】:

如果您只有以下几个事件适合您 - 您将需要构建尽可能多的相应行,因为您有不同的事件。如果预期事件的数量不变 - 您总是可以轻松地构建一次这样的查询然后使用它

SELECT 
  userID,
  SUM(CASE WHEN event = 'event1' THEN [count] ELSE 0 END) AS event1,
  SUM(CASE WHEN event = 'event2' THEN [count] ELSE 0 END) AS event2,
  SUM(CASE WHEN event = 'event3' THEN [count] ELSE 0 END) AS event3,
  SUM(CASE WHEN event = 'event4' THEN [count] ELSE 0 END) AS event4
FROM YourTable
GROUP BY userId

如果您需要更动态的东西 - 查看非常相似的示例 https://***.com/a/36623258/5221944

在您的情况下,构建动态 sql 的查询将如下所示

SELECT 'SELECT userId, ' + 
   GROUP_CONCAT_UNQUOTED(
      'SUM(IF(event="'+event+'",[count],0)) as [d_'+REPLACE(event,'/','_')+']'
   ) 
   + ' FROM YourTable GROUP BY userId ORDER BY userId'
FROM (
  SELECT event FROM YourTable GROUP BY event ORDER BY event
)

注意下一行

      'SUM(IF(event="'+event+'",[count],0)) as [d_'+REPLACE(event,'/','_')+']'

它确保您的偶数名称符合字段/列名称的要求 如果您的事件总是看起来像 event1、event2 等,您可以简化这一行并使用

      'SUM(IF(event = "' + event + '", [count], 0)) as ' + event

【讨论】:

我读过,但它的方式非常不同。有什么简单的方法可以做到这一点?例如,在 R 语言中有函数 cast()。但是没有 R 或 python pandas 我怎么能做到这一点 如果您想在不使用任何脚本的情况下在 Web UI 中执行此操作,您可以获得的最佳效果。如果您愿意使用您选择的任何客户端 - 无论如何您都应该遵循首先构建动态查询然后运行它的相同路径。注意:在 BigQuery 的当前实现中 - 这是唯一的方法。没有任何 PIVOT 特定功能可以为您提供支持。让我们希望在新的 BigQuery 方言中——Google 团队一直在提及——这将得到支持 设定预期 - 即将更新的 SQL 方言会有很多改进,但 PIVOT 和 UNPIVOT 不在其中。 感谢 Mosha 清除此问题!期待玩新的方言!兴奋!

以上是关于Big Query 或 SQL 重塑数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Google Cloud SQL 与 Google Big Query 集成

Google Big Query 标准 SQL,在 SELECT 语句中添加一列

多个 Big Query 表或类似数据的单数表

如何在 Google Big Query 中正确使用 GROUP BY 命令?

Big Query (SQL) 将多列转换为行/数组

如何使用 JSON_EXTRACT 或 JSON_EXTRACT_SCALAR 在 Big Query 中读取多级 JSON 数据