请求校验对GCP BigQuery SQL查询各子句逻辑的解读是否正确
这段BigQuery SQL逻辑的解读校验
你的理解完全准确的部分
- WITH子句(CTE公共表表达式)的基础作用判断正确:第一个名为
logins的临时结果集确实从gcp-project-223467.web.top_level表取数,筛选2022-01-01及之后的数据,排除'Home'、'Team'两个页面,按日期、页面维度分组,聚合计算总会话数、带登出行为的会话数、总点击量。 - 主查询的整体结构判断正确:主查询先读取
logins临时表的所有字段,再左关联别名login_days的子查询结果,关联逻辑为日期、页面两个字段同时匹配,最终合并输出两个来源的聚合字段。 login_days子查询中CASE WHEN的作用判断正确:确实是通过条件聚合,按登录类型分别统计网页端、移动端、iOS端、安卓端的登录量,以及全量维度的去重登录总数。
存在理解偏差、疏漏的部分
- 表名识别错误:你注释里写左关联的表来源是
ingka-web-analytics-prod.web_data.transactions,实际代码中该子查询读取的是gcp-project-223467.web.login_data表。 - 关联条件描述错误:你注释里提到关联条件包含
logins_web字段,实际关联逻辑仅为logins.date = login_days.date和logins.page = login_days.page两个匹配条件,没有用到logins_web字段。 - 过滤条件有疏漏:
- 第一个
logins临时表除了你提到的日期、页面筛选,还额外加了clicks > 0的规则,只保留有点击行为的记录 login_days子查询除了你提到的日期、页面筛选,还过滤了count_logins_final为NaN、包含逗号、值小于等于0的记录,排除了平台为'ibes'的数据,且仅保留登录状态为'Successful'的成功登录记录- 主查询末尾有全局过滤条件
WHERE sessions_with_logout > 0,会把所有带登出行为的会话数小于等于0的记录全部剔除,这时候左关联的实际效果和内关联接近,不会保留左表中无右表匹配但被过滤掉的记录
- 第一个
- 代码存在一处显性语法问题:
login_days子查询的SELECT字段列表中,最后一个字段COUNT(DISTINCT login_id) AS logins_final,末尾多了一个冗余逗号,在BigQuery中运行会直接报语法错误,需要删除这个多余逗号才能正常执行。
-- 修正注释、修复语法问题后的完整参考代码 WITH logins AS ( SELECT session_date as date, website_page as page, SUM(sessions) AS sessions, SUM(sessions_with_logout) AS logouts, SUM(clicks) AS clicks FROM `gcp-project-223467.web.top_level` WHERE DATE_session >= "2022-01-01" AND website_page NOT IN ('Home','Team') AND clicks > 0 GROUP BY 1, 2 ) SELECT logins.*, logins_web, mobile_logins, logins_ios, logins_android, logins_final FROM logins LEFT JOIN ( SELECT date_hit as date, website_page as page, SUM(CASE WHEN login_type = 'web' THEN SAFE_CAST(count_logins_final AS INT64) END ) AS logins_web, COUNT(DISTINCT CASE WHEN login_type = 'mobile' THEN login_id END ) AS mobile_logins, SUM(CASE WHEN login_type = 'ipad' THEN SAFE_CAST(count_logins_final AS INT64) END ) AS logins_ios, COUNT(DISTINCT CASE WHEN login_type = 'android' THEN login_id END ) AS logins_android, COUNT(DISTINCT login_id) AS logins_final FROM `gcp-project-223467.web.login_data` WHERE date_hit >= "2022-01-01" AND website_page NOT IN ('Home','Team') AND count_logins_final != 'NaN' AND count_logins_final NOT LIKE '%,%' AND count_logins_final > '0' AND website_platform != 'ibes' AND login_type = 'Successful' GROUP BY 1, 2 )login_days ON logins.date = login_days.date AND logins.page = login_days.page WHERE sessions_with_logout > 0
内容的提问来源于stack exchange,提问作者Keith Cozart
相关产品推荐
相关产品推荐

