BigQuery中NOT EXISTS与EXISTS查询基因组数据结果差异问题
两条SQL查询结果差异的核心原因
逻辑本质不对等
两个WHERE条件的判断逻辑完全不同,核心差异是对call.FILTER空数组的处理规则:
- 第一条查询的
NOT EXISTS (SELECT 1 FROM UNNEST(call.FILTER) AS call_filter WHERE call_filter != 'PASS')
含义是不存在任何非PASS的过滤标签,满足该条件的场景有两种:- FILTER数组中仅包含
PASS值 - FILTER是空数组:UNNEST空数组会返回空结果集,子查询找不到符合
!= 'PASS'的记录,EXISTS返回FALSE,因此NOT EXISTS返回TRUE,该条记录会被计入统计
- FILTER数组中仅包含
- 第二条查询的
EXISTS (SELECT 1 FROM UNNEST(call.FILTER) AS call_filter WHERE call_filter = 'PASS')
含义是至少存在一个PASS过滤标签,仅当FILTER数组中明确有PASS值时才会命中,空数组UNNEST后没有记录,EXISTS直接返回FALSE,会被排除在统计之外。
数量差异的对应解释
你观察到的量级差刚好对应数据集的两类合格call:
- 第二条查询返回的400余万条记录,是FILTER字段明确标记了
PASS的变异位点call - 第一条查询多出来的2000余万条记录,都是FILTER为空的call:这类call大多是样本在该位点为参考基因型的非变异call,DeepVariant输出时不会给这类call加任何过滤标签,自然也不存在非PASS的过滤条件,完全符合你「排除所有携带非PASS过滤条件的call」的统计需求。
空数组判定为合格的规则依据
这符合基因组VCF格式的通用规则:FILTER字段为空代表该call未触发任何失败的过滤阈值,等效于质量合格,统计全位点合格call时必须纳入。如果你的需求仅为统计明确标记PASS的变异位点,才适合使用第二条查询的写法。
内容的提问来源于stack exchange,提问作者Paisley
相关产品推荐
相关产品推荐

