You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,该条记录会被计入统计
  • 第二条查询的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:45:05