将多个SELECT语句合并为单查询——SQL BigQuery求助
合并BigQuery SQL查询:筛选多工单用户的指定时段数据
直接给你合并后的完整查询,同时修正了原查询2的疏漏(原查询2未添加时间范围和非垃圾工单过滤,不符合你的需求):
SELECT member_account, case_id, case_creation_time, handle_time, DATE_ADD(case_creation_time, INTERVAL handle_time SECOND) AS Clsd FROM ( SELECT *, -- 计算当前用户在指定时段内的工单总数 COUNT(case_id) OVER(PARTITION BY member_account) AS case_count FROM `email_cases` WHERE -- 时间范围:过去8天到前一天 case_creation_time BETWEEN TIMESTAMP(DATE_SUB(CURRENT_DATE(), INTERVAL 8 DAY)) AND TIMESTAMP(DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)) AND is_spam = FALSE ) -- 只保留时段内工单数量>1的用户数据 WHERE case_count > 1 ORDER BY member_account DESC
逻辑说明
- 内层子查询:先完成基础过滤(指定时间范围+非垃圾工单),同时用窗口函数
COUNT() OVER(PARTITION BY member_account)一次性算出每个用户在该时段的工单总数量,避免重复扫描表。 - 外层查询:只保留工单数量大于1的用户的所有工单记录,完全匹配你的两个需求。
为什么不用JOIN关联?
原思路是把两个查询用JOIN关联,但窗口函数的方式只需要扫描一次表,性能更优,代码也更简洁,尤其适合BigQuery这类大数据场景。另外注意原查询2未添加时间和is_spam过滤,会统计用户所有时段的工单,不符合你「目标时间内提交数量>1」的要求,合并时必须把过滤条件统一放在内层。
内容的提问来源于stack exchange,提问作者Chip Brazell
相关产品推荐
相关产品推荐

