如何优化该SQL查询?能否避免使用CTE实现指定数据筛选需求
优化方案:用窗口函数替代CTE实现需求
可以完全避免CTE,利用窗口函数ROW_NUMBER()(或RANK())直接在单表扫描中完成筛选,代码更简洁直观:
基础实现(仅保留单条最新记录)
SELECT * FROM ( SELECT *, -- 按ID分组,每组内按集成日期倒序编号,最新记录编号为1 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY INTEGRATION_DATE DESC) AS record_rank FROM table_1 ) filtered WHERE -- 非X的记录全部保留 variable_A != 'X' -- X的记录仅保留每组编号为1的最新记录 OR record_rank = 1;
兼容多同日期最新记录的版本
如果存在同一ID下多条记录拥有相同的最大INTEGRATION_DATE,原CTE写法会保留所有这些记录,此时可以把ROW_NUMBER()换成RANK()来匹配原逻辑:
SELECT * FROM ( SELECT *, RANK() OVER (PARTITION BY ID ORDER BY INTEGRATION_DATE DESC) AS record_rank FROM table_1 ) filtered WHERE variable_A != 'X' OR record_rank = 1;
优化优势
- 无需额外的分组关联操作,仅需一次表扫描,逻辑更紧凑
- 直接在子查询中完成排序编号,筛选条件清晰易懂
- 避免CTE带来的额外层级,代码结构更扁平
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

