【问题标题】:Bigquery SQL - Is it better to unnest in SELECT or JOIN?Bigquery SQL - 在 SELECT 或 JOIN 中取消嵌套更好吗?
【发布时间】:2018-04-12 20:47:47
【问题描述】:

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

是否有任何文档讨论了在 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; 

谢谢

【问题讨论】:

标签: sql google-bigquery unnest


【解决方案1】:

工作查询:

一)

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

第一个查询看起来更短更简洁,但我们还要看一下说明选项卡:

一)

b)

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

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

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

【讨论】:

  • 如果在“views”中嵌套了另一个称为“clicks”的级别,并且我想获取会话级别的点击次数,是否有类似 ARRAY_LENGTH(hits) 的快捷方式?
  • 用点导航?如果你给我一个具体的数据集,我就能给你一个具体的答案。
【解决方案2】:

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

因此,第一个查询只返回与您的 sessions 表一样多的行以及数组字段中的条目数。
而第二个查询,除了上述之外,还对所有行进行分组并汇总各自的计数

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

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多