如何在统计全部及指定行数据时避免多SELECT语句
优化后的SQL语句
你可以通过条件聚合将两个统计逻辑合并到单个查询中,避免重复扫描数据集:
SELECT COUNT(DISTINCT user_pseudo_id) AS total_active_users, COUNT(DISTINCT CASE WHEN _TABLE_SUFFIX BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY)) AND FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) THEN user_pseudo_id END) AS active_users_last_30_days FROM `myDbSet.events_*` WHERE event_name = 'screen_view'
优化说明
- 只需要扫描一次
events_*表,比原方案的两次独立查询更节省资源,执行效率更高。 COUNT(DISTINCT CASE...)逻辑:当表后缀符合近30天的日期范围时,保留对应的user_pseudo_id,否则返回NULL;COUNT会自动忽略NULL值,最终统计出近30天的独立用户数。- 第一个
COUNT(DISTINCT user_pseudo_id)不受CASE条件限制,统计所有符合event_name = 'screen_view'的独立用户总数。
内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch
相关产品推荐
相关产品推荐

