SQL:在BigQuery

时间:2017-11-01 12:05:42

标签: sql google-bigquery

我知道fullVisitorId, visitID, visitNumber, totals.pageviews,它们都会向我提供有关会话的信息。

我正在尝试编写一个有效的查询,这样我只会查看新用户来创建下表:

user | #visits | #total_pages | #pages/visit

我想出的示例数据库:

Row fullVisitorId   visitID                 visitNumber  page_views
1   27              15                      1            10
2   27              20                      2            15
3   27              1921                    3            5
4   654             15                      1            28 
5   575             16                      3            1
6   547             16                      1            4

用户列中填充了fullVisitorId,#visits是访问次数。

由于我只对新用户感兴趣,我首先写了一个查询来选择新用户,其中访问号码= 1.这是

SELECT fullVisitorId FROM (SELECT fullVisitorId, visitID, visitNumber, page_views FROM [table] WHERE visitNumber =1) GROUP BY fullVisitorId

现在,这是我数据库中的第一列,user表已完成。

对于第二列#visits,我需要查找访问次数,这只是属于用户的唯一visitIDs的SUM。它应该为用户27返回3,为用户654和547返回1(注意不包括用户575)。类似的东西:

  

SELECT * FROM(table)WHERE fullVisitorID IN(1stQuery)删除   旧用户(仅限新增用户),然后计算访问次数。

第3列,将聚合查看的页数,并返回(10 + 15 + 5 = 30)用户27,依此类推。

最后一栏只是#total_pages和#visits的划分。

理想情况下,最后我会得到:

user | #visits | #total_pages | #pages/visit
27     3         30             10
654    1         28             28
547    1         4              4

1 个答案:

答案 0 :(得分:1)

我会用聚合来做这件事:

SELECT fullVisitorId, COUNT(*) as NumVisits,
       SUM(PageViews) as TotalPages,
       AVG(PageViews) as AvgPages
FROM [table] 
GROUP BY fullVisitorId
HAVING MIN(VisitNumber) = 1;

我认为通过在聚合之前进行过滤使查询更加复杂,我无法获得任何收益。