如何在SQL中提取FY2018-2019、FY2022-2023财年数据并去重?
财年数据提取:修正SQL条件与解决重复问题
先修正你的SQL日期范围错误
你当前的SQL条件完全写反了日期范围,导致逻辑错误。以财年(通常为当年7月至次年6月)为例,FY2018-2019的正确时间范围是2018年7月1日到2019年6月30日,对应的SQL条件应该是:
WHERE (TRUNC(rep_date) >= '01-JUL-2018' AND TRUNC(rep_date) <= '30-JUN-2019') -- FY2018-2019 OR (TRUNC(rep_date) >= '01-JUL-2022' AND TRUNC(rep_date) <= '30-JUN-2023') -- FY2022-2023
原条件中的<= '01-jul-2018' AND >= '30-jun-2019'是一个不可能成立的空范围,根本不会返回FY2018-2019的数据;FY2022-2023的条件同理写反,这大概率是你遇到异常重复的核心原因。
处理数据重复的替代方案
修正日期范围后如果仍有重复,无需强制分文件提取,可根据重复类型选择以下方法:
整行重复:用DISTINCT去重
如果重复是整行数据完全一致,直接在SELECT后添加DISTINCT关键字即可:SELECT DISTINCT col1, col2, ... -- 建议指定具体字段而非*,提升性能 FROM your_table WHERE (TRUNC(rep_date) >= '01-JUL-2018' AND TRUNC(rep_date) <= '30-JUN-2019') OR (TRUNC(rep_date) >= '01-JUL-2022' AND TRUNC(rep_date) <= '30-JUN-2023')关联查询导致重复:调整JOIN或用聚合函数
如果重复是因为多表关联时的一对多关系(比如一条主数据对应多条明细),可以优化JOIN条件,或者用GROUP BY配合MAX()/MIN()等聚合函数获取唯一记录。分查询无重复:用UNION ALL合并
如果你分两次单独查询各财年数据时没有重复,可以用UNION ALL合并结果,既保证一次提取,又避免OR可能带来的执行计划问题:SELECT col1, col2, ... FROM your_table WHERE TRUNC(rep_date) >= '01-JUL-2018' AND TRUNC(rep_date) <= '30-JUN-2019' UNION ALL SELECT col1, col2, ... FROM your_table WHERE TRUNC(rep_date) >= '01-JUL-2022' AND TRUNC(rep_date) <= '30-JUN-2023'若分查询本身有重复,可换成
UNION(自动去重,但性能略低于UNION ALL)。
总结
优先修正SQL的日期范围错误,再根据重复的具体原因选择去重或查询优化方案,完全不需要分文件提取。
内容的提问来源于stack exchange,提问作者Lizzie
相关产品推荐
相关产品推荐

