SQL查询多条件同时成立时如何用CASE语句返回单条结果
问题根因
原查询使用DISTINCT对userId、sessionId、conversion_index三个字段联合去重,当同一会话下同时存在pageType='confirm'和其他类型的页面记录时,会生成conversion_index值不同的两行数据,无法满足单会话单条结果的要求。
修正逻辑
按userId+sessionId维度分组聚合,只要组内存在任意一条pageType='confirm'的记录,conversion_index就返回yes,否则返回No,从根源上避免重复行。
修正后SQL(BigQuery原生写法,适配当前UNNEST语法)
SELECT userId, sessionId, CASE WHEN LOGICAL_OR(p.pageType = 'confirm') THEN 'yes' ELSE 'No' END AS conversion_index FROM ccart.sessv6_79633508 AS sess, UNNEST(pages) p WHERE sess.createdAt >= TIMESTAMP('2021-07-01') AND sess.createdAt <= TIMESTAMP('2021-10-11') AND userId = '206885636.2915067519' AND sessionId = 'GH178U' GROUP BY userId, sessionId
通用兼容写法(适配所有支持标准SQL的引擎)
如果运行环境不支持LOGICAL_OR函数,可以替换为MAX条件判断的写法,效果完全一致:
SELECT userId, sessionId, CASE WHEN MAX(CASE WHEN p.pageType = 'confirm' THEN 1 ELSE 0 END) = 1 THEN 'yes' ELSE 'No' END AS conversion_index FROM ccart.sessv6_79633508 AS sess, UNNEST(pages) p WHERE sess.createdAt >= TIMESTAMP('2021-07-01') AND sess.createdAt <= TIMESTAMP('2021-10-11') AND userId = '206885636.2915067519' AND sessionId = 'GH178U' GROUP BY userId, sessionId
- 两种写法都去掉了原有的冗余嵌套子查询,直接在展开pages数组后做分组聚合,执行效率更高。
- 分组逻辑严格按照
userId和sessionId两个维度聚合,保证每个用户会话组合仅返回一条结果。
内容的提问来源于stack exchange,提问作者Vishal Pathak
相关产品推荐
相关产品推荐

