Bigquery SQL - 在SELECT或JOIN中删除更好吗?

时间:2017-10-31 15:53:20

标签: sql google-bigquery unnest

我有一个数据集,其中视图嵌套在会话中,我希望每个会话都有一个视图计数。构建此类查询的更有效/正确的方法是什么?

是否有任何文档讨论在BigQuery SQL中编写查询的首选方法?

SELECT session_key, ( SELECT COUNT( view_id ) FROM UNNEST( views ) views ) AS view_count 
FROM sessions 
WHERE _PARTITIONTIME >= TIMESTAMP( '2016-04-01' ) ;

SELECT session_key, COUNT( view_id ) AS view_count 
FROM sessions 
  LEFT JOIN UNNEST( views ) views 
WHERE _PARTITIONTIME >= TIMESTAMP( '2016-04-01' ) 
GROUP BY session_key; 

谢谢

2 个答案:

答案 0 :(得分:4)

工作查询:

A)

SELECT visitId, ( SELECT COUNT( hitNumber ) FROM UNNEST( hits ) ) AS view_count 
FROM `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910`

b)中

SELECT visitId, COUNT( hitNumber ) AS view_count 
FROM `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910`
LEFT JOIN UNNEST( hits )  
GROUP BY visitId

第一个查询看起来更简短,更简洁,但我们也看看解释标签:

A) enter image description here

b)中 enter image description here

它在执行时也看起来更好!可能是因为第二个查询有GROUP BY visitId,这会强制BigQuery查看是否有任何其他具有相同ID的会话。

但如果您正在寻找更简洁的选择:

SELECT visitId, ARRAY_LENGTH(hits) AS view_count 
FROM `google.com:analytics-bigquery.LondonCycleHelmet.ga_sessions_20130910`

答案 1 :(得分:1)

这不仅仅是which way better? - 它也是which way reflects your goal?,因为这些结果不同!你可以在Felipe的答案中看到这一点 - 第一个查询返回63行,第二个查询返回62行

因此,第一个查询只返回与sessions表一样多的行以及数组字段中的条目数。
而除了上述内容之外,第二个查询将所有行分组并聚合各自的计数

当然,如果您的表格中的所有visitId都是唯一的 - 这会产生相同的结果 但是因为这个额外的分组 - 我希望第二个查询更加昂贵