Big Query 或 SQL 重塑数据

iva*_*van 5 sql google-bigquery

我使用 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 
Run Code Online (Sandbox Code Playgroud)

我怎么能得到这个表?(在列事件{索引}计数总和)仅使用能力 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    |
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 2

如果您只有很少的事件,下面将适合您 - 您将需要构造与您有不同事件一样多的相应行。如果预期事件的数量不变 - 您始终可以轻松构建一次此类查询,然后使用它

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
Run Code Online (Sandbox Code Playgroud)

如果您需要更动态的东西 - 查看非常相似的示例/sf/answers/2563628091/

在您的情况下,构建动态 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
)
Run Code Online (Sandbox Code Playgroud)

注意下面一行

      'SUM(IF(event="'+event+'",[count],0)) as [d_'+REPLACE(event,'/','_')+']'
Run Code Online (Sandbox Code Playgroud)

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

      'SUM(IF(event = "' + event + '", [count], 0)) as ' + event
Run Code Online (Sandbox Code Playgroud)