寻求简洁SQL语句实现特定数据筛选去重需求
针对需求的SQL查询优化方案
核心思路
明确需求:筛选满足以下任一条件的去重行:
end_month等于全局最大的working_monthend_month大于等于当前月份
优化方向聚焦于减少重复计算、利用数据库优化器的高效执行计划,以及合理利用索引。
方案一:预计算最大working_month + OR条件 + DISTINCT
通过CTE(或子查询)提前算出全局最大的working_month,避免在WHERE子句中重复调用聚合函数,再用OR组合条件,最后用DISTINCT去重。
-- MySQL/PostgreSQL通用写法(当前月份函数需对应调整) WITH max_working AS ( SELECT MAX(working_month) AS max_month FROM your_table ) SELECT DISTINCT t.* FROM your_table t CROSS JOIN max_working m WHERE t.end_month = m.max_month OR t.end_month >= TO_CHAR(CURRENT_DATE, 'YYYYMM'); -- PostgreSQL用此写法,MySQL替换为DATE_FORMAT(NOW(), '%Y%m')
方案二:UNION自动去重
利用UNION自带的去重特性,分开查询两个条件的结果再合并,无需手动添加DISTINCT,部分场景下数据库优化器会生成更高效的执行计划。
WITH max_working AS ( SELECT MAX(working_month) AS max_month FROM your_table ) SELECT t.* FROM your_table t JOIN max_working m ON t.end_month = m.max_month UNION SELECT t.* FROM your_table t WHERE t.end_month >= TO_CHAR(CURRENT_DATE, 'YYYYMM');
性能优化建议
- 索引优化:给
end_month建立单独索引,或给(end_month, working_month)建立联合索引,既可以加速end_month的过滤逻辑,也能让MAX(working_month)的计算更高效(通过覆盖索引扫描完成)。 - 执行计划对比:实际使用时可通过
EXPLAIN查看两种方案的执行计划,根据数据分布选择更优方案。若两个条件的结果集重叠度高,方案一的OR条件可能更高效;若重叠度低,方案二的UNION执行速度更快。
内容的提问来源于stack exchange,提问作者shenhengbin
相关产品推荐
相关产品推荐

