如何动态减少MONTH1表取数月份,实现12个月数据留存查询?
实现方案
要满足你需求的核心逻辑是:根据MONTH2表中已有的月份数量,动态调整从MONTH1表中获取的月份数,最终合并后始终保留12个月数据。以下是具体的SQL实现思路和代码:
核心逻辑拆解
- 统计MONTH2表中已存在的唯一月份数量,记为
month2_count。 - 从MONTH1表中筛选出最新的(12 - month2_count)个月的数据;当
month2_count >= 12时,不再从MONTH1取数。 - 将筛选后的MONTH1数据与MONTH2的所有数据合并,确保最终输出恰好12个月的内容。
具体SQL实现(通用版本)
WITH month2_month_count AS ( -- 统计MONTH2中已有的唯一月份数 SELECT COUNT(DISTINCT MONTH) AS count FROM MONTH2 ), filtered_month1_data AS ( SELECT MONTH, COUNTRY_NAME, WEBSITE FROM ( -- 给MONTH1的月份按时间倒序排,标记行号 SELECT MONTH, COUNTRY_NAME, WEBSITE, ROW_NUMBER() OVER (ORDER BY MONTH DESC) AS row_num FROM MONTH1 GROUP BY MONTH, COUNTRY_NAME, WEBSITE ) ranked_month1 -- 关联MONTH2的统计结果,筛选出需要的月份 CROSS JOIN month2_month_count WHERE row_num <= (12 - month2_month_count.count) -- 当MONTH2已有12个月时,MONTH1不再输出数据 AND month2_month_count.count < 12 ) -- 合并筛选后的MONTH1和全部MONTH2数据 SELECT MONTH, COUNTRY_NAME, WEBSITE FROM filtered_month1_data UNION ALL SELECT MONTH, COUNTRY_NAME, WEBSITE FROM MONTH2 GROUP BY MONTH, COUNTRY_NAME, WEBSITE -- 可选:按月份倒序排列,方便查看最新数据 ORDER BY MONTH DESC;
关键细节说明
- 月份排序:确保
MONTH字段是可按时间排序的格式(如YYYY-MM),否则ORDER BY MONTH DESC无法正确获取最新月份。如果你的MONTH是数字或其他格式,需要调整排序逻辑(比如转换为日期类型)。 - 去重逻辑:保留了你原查询中的
GROUP BY,确保每个(月份、国家、网站)组合唯一。 - 边界处理:
- 当MONTH2为空时,自动从MONTH1取最新12个月数据;
- 当MONTH2有n个月(n<12),MONTH1取最新(12-n)个月,合并后刚好12个月;
- 当MONTH2满12个月时,MONTH1部分查询返回空,结果仅包含MONTH2的12个月数据。
简化版SQL(无CTE)
如果你的SQL环境不支持CTE,可以用子查询实现:
SELECT MONTH, COUNTRY_NAME, WEBSITE FROM ( SELECT MONTH, COUNTRY_NAME, WEBSITE, ROW_NUMBER() OVER (ORDER BY MONTH DESC) AS row_num FROM MONTH1 GROUP BY MONTH, COUNTRY_NAME, WEBSITE ) ranked_month1 WHERE row_num <= (12 - (SELECT COUNT(DISTINCT MONTH) FROM MONTH2)) AND (SELECT COUNT(DISTINCT MONTH) FROM MONTH2) < 12 UNION ALL SELECT MONTH, COUNTRY_NAME, WEBSITE FROM MONTH2 GROUP BY MONTH, COUNTRY_NAME, WEBSITE ORDER BY MONTH DESC;
内容的提问来源于stack exchange,提问作者aurala20
相关产品推荐
相关产品推荐

