在BigQuery中以列方式堆叠/附加表格

时间:2018-01-25 09:51:24

标签: sql google-bigquery

我在BigQuery中有一个表,每天都会获取新数据并将其附加到当前表中。此表称为:score_FULL。此外,我会每天保留个人分数,如果我们选择今天的日期,可以score_20180125访问。每日分数会每天附加到score_FULL

score_FULL包含:

visitorID         score
#Older scores first
1                 0.15
2                 0.78
3                 0.12
6                 0.90
------------------------
2                 0.22
6                 0.65
7                 0.61
10                0.24
------------------------
1                 0.31
2                 0.41
10                0.12
-------------------------
#Newest scores appended

我希望看到用户分数发生变化。每次用户获得新分数时,我们都会水平附加。每当我们得到一个新用户时,我们会垂直添加它。假设用户每天只能获得1分,理想解决方案是:

visitorID     score1      score2       score3
1             0.15        0.31
2             0.78        0.22         0.41
3             0.12 

E.g。水平增长的表格(新分数)和垂直增长的表格(新用户)

我可以在单个表上使用一系列Left Joins做类似的事情,但是这只会给我从第一个表中运行左边连接的访问​​者数据。

  

注意:我可以添加另一列Date,它只会重复   所有值的相同日期,如果它使事情变得更容易。

1 个答案:

答案 0 :(得分:2)

不是动态添加列(这在这里是一个很大的挑战) - 我建议将一列中各自访问者的分数汇总为一个数组或一串个别分数

以下是BigQuery Standard SQL

     
#standardSQL
WITH `project.dataset.score_FULL` AS ( 
  SELECT 1 visitorID, 0.15 score UNION ALL
  SELECT 2, 0.78 UNION ALL
  SELECT 3, 0.12 UNION ALL
  SELECT 6, 0.90 UNION ALL
  SELECT 2, 0.22 UNION ALL
  SELECT 6, 0.65 UNION ALL
  SELECT 7, 0.61 UNION ALL
  SELECT 10, 0.24 UNION ALL
  SELECT 1, 0.31 UNION ALL
  SELECT 2, 0.41 UNION ALL
  SELECT 10, 0.12 
)
SELECT 
  visitorID,
  ARRAY_AGG(score) scores_as_array,
  STRING_AGG(CAST(score AS STRING)) scores_as_list
FROM `project.dataset.score_FULL`
GROUP BY visitorID   

输出为

Row visitorID   scores_as_array scores_as_list   
1   1           0.15            0.15,0.31    
                0.31         
2   2           0.78            0.78,0.22,0.41   
                0.22         
                0.41         
3   3           0.12            0.12     
4   6           0.9             0.9,0.65     
                0.65         
5   7           0.61            0.61     
6   10          0.24            0.24,0.12    
                0.12