使用EXISTS实现TSQL按站点判断的聚合查询优化咨询
更优实现方案
你可以用窗口函数实现单次表扫描完成计算,相比你现有用APPLY、EXCEPT的写法,逻辑更简洁,执行效率也更高,在数据量较大的场景下性能优势会更明显。
实现代码如下:
SELECT sn, site, cond, CASE WHEN has_xy > 0 THEN NULL ELSE SUM(val) END AS revisedTotal FROM ( SELECT *, SUM(CASE WHEN cond IN ('X', 'Y') THEN 1 ELSE 0 END) OVER (PARTITION BY site) AS has_xy FROM @t1 ) t GROUP BY sn, site, cond, has_xy ORDER BY site, sn
逻辑说明
- 内层查询通过窗口函数给每个站点标记
has_xy:只要该站点下存在任意一条cond为X或Y的记录,has_xy的取值就会大于0,同一个站点的所有行has_xy取值一致 - 外层按照
sn、site、cond分组后,判断如果当前站点has_xy>0就返回NULL,否则返回val字段的求和结果,完全匹配你给出的期望输出 - 整个查询仅需要扫描一次原始表,不需要额外的关联操作,执行开销远低于你现有的两种实现
内容的提问来源于stack exchange,提问作者smpa01
相关产品推荐
相关产品推荐

