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

寻求简洁SQL语句实现特定数据筛选去重需求

针对需求的SQL查询优化方案

核心思路

明确需求:筛选满足以下任一条件的去重行:

  • end_month 等于全局最大的 working_month
  • end_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');

性能优化建议

  1. 索引优化:给end_month建立单独索引,或给(end_month, working_month)建立联合索引,既可以加速end_month的过滤逻辑,也能让MAX(working_month)的计算更高效(通过覆盖索引扫描完成)。
  2. 执行计划对比:实际使用时可通过EXPLAIN查看两种方案的执行计划,根据数据分布选择更优方案。若两个条件的结果集重叠度高,方案一的OR条件可能更高效;若重叠度低,方案二的UNION执行速度更快。

内容的提问来源于stack exchange,提问作者shenhengbin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:26:10