请求修正月度数据删除SQL查询:每周加载每月删除当月数据
修正后的删除语句及问题说明
你的核心需求是删除表中最新数据所在月份的所有记录,保留该月份之前的历史数据,原查询存在逻辑冗余和语法错误,以下是修正方案:
原查询的问题
- 子查询
SELECT DISTINCT(DATA_WEEK)... ORDER BY DATA_WEEK DESC未添加LIMIT 1,会返回多条符合条件的日期,导致WHERE DATA_WEEK > (...)触发「单行子查询返回多行」的报错。 - 逻辑嵌套复杂,可读性差,且在跨年场景下容易出现判断偏差。
修正后的简洁写法
方法1:使用DATE_TRUNC定位月份(推荐)
DELETE FROM MHCD_AGG_CUST_ORG_SLS_WIDE_WK WHERE DATE_TRUNC('month', DATA_WEEK) = ( SELECT DATE_TRUNC('month', MAX(DATA_WEEK)) FROM ADS.MHCD_AGG_CUST_ORG_SLS_WIDE_WK );
方法2:使用年份+月份组合判断
如果你的数据库不支持DATE_TRUNC,可以用年份和月份的组合进行匹配:
DELETE FROM MHCD_AGG_CUST_ORG_SLS_WIDE_WK WHERE (EXTRACT(YEAR FROM DATA_WEEK), EXTRACT(MONTH FROM DATA_WEEK)) = ( SELECT EXTRACT(YEAR FROM MAX(DATA_WEEK)), EXTRACT(MONTH FROM MAX(DATA_WEEK)) FROM ADS.MHCD_AGG_CUST_ORG_SLS_WIDE_WK );
方案说明
- 直接定位到表中最新
DATA_WEEK所在的年月,逻辑清晰,避免原查询的语法错误。 - 完美处理跨年场景(比如最新数据在2024年1月时,会准确删除该月所有数据,保留2023年及之前的记录)。
- 执行效率更高,减少了不必要的排序和嵌套子查询操作。
内容的提问来源于stack exchange,提问作者Shalini Sharma
相关产品推荐
相关产品推荐

