Bigquery SQL - unnest in SELECT 还是 JOIN 更好?
Bigquery SQL - Is it better to unnest in SELECT or JOIN?
我有一个数据集,其中视图嵌套在会话中,我想要计算每个会话的视图数。构建此类查询的更多 efficient/proper 方法是什么?
是否有任何文档讨论在 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;
谢谢
工作查询:
一)
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`
这不仅仅是关于 which way better?
- 它也是关于 which way reflects your goal?
因为它们的结果是不同的!您可以在 Felipe 的回答中看到这一点 - 第一个查询 returns 63 行和第二个查询 returns 62 行
因此,第一个查询只是 returns 与您的 sessions
table 一样多的行以及数组字段中的条目数。
而除了上述之外,第二个查询对所有行进行分组并汇总各自的计数
当然,如果您的 table 所有 visitId 都是唯一的 - 这会产生相同的结果
但是因为这个额外的分组 - 我希望第二个查询更昂贵
我有一个数据集,其中视图嵌套在会话中,我想要计算每个会话的视图数。构建此类查询的更多 efficient/proper 方法是什么?
是否有任何文档讨论在 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;
谢谢
工作查询:
一)
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`
这不仅仅是关于 which way better?
- 它也是关于 which way reflects your goal?
因为它们的结果是不同的!您可以在 Felipe 的回答中看到这一点 - 第一个查询 returns 63 行和第二个查询 returns 62 行
因此,第一个查询只是 returns 与您的 sessions
table 一样多的行以及数组字段中的条目数。
而除了上述之外,第二个查询对所有行进行分组并汇总各自的计数
当然,如果您的 table 所有 visitId 都是唯一的 - 这会产生相同的结果
但是因为这个额外的分组 - 我希望第二个查询更昂贵