如何获取数据表中当前月份的滚动12个月记录?
如何筛选最新月份过去12个月的记录
要实现这个需求,核心是两步:先找到数据表中的最新月份,再计算出这个月份往前推12个月的起始值,最后筛选出落在这个区间内的记录。下面分步骤给你具体的实现方案,适配主流数据库:
步骤1:确定最新月份
首先我们需要从表中获取最大的Month值(也就是最新的月份),用聚合函数MAX()就能快速拿到:
SELECT MAX(Month) FROM your_table_name;
步骤2:计算过去12个月的起始月份
因为Month是YYYYMM格式的数字,直接做数值运算容易出错(比如201801减12会得到201789,显然不对),所以最好先把它转换成日期类型,再做月份偏移,最后转回YYYYMM格式。
针对MySQL的实现
-- 先获取最新月份并计算起始月份,再筛选数据 SELECT ID, Month FROM your_table_name WHERE Month >= ( SELECT DATE_FORMAT(DATE_SUB(STR_TO_DATE(CONCAT(MAX(Month), '01'), '%Y%m%d'), INTERVAL 12 MONTH), '%Y%m') FROM your_table_name );
解释:
STR_TO_DATE(CONCAT(MAX(Month), '01'), '%Y%m%d'):把YYYYMM的数字转换成具体日期(比如201804变成2018-04-01)DATE_SUB(..., INTERVAL 12 MONTH):将日期往前推12个月,得到2017-04-01DATE_FORMAT(..., '%Y%m'):把日期转回YYYYMM格式的字符串(或数字)
针对SQL Server的实现
SELECT ID, Month FROM your_table_name WHERE Month >= ( SELECT CONVERT(VARCHAR(6), DATEADD(MONTH, -12, CAST(CONCAT(MAX(Month), '01') AS DATE)), 112) FROM your_table_name );
解释:
CAST(CONCAT(MAX(Month), '01') AS DATE):将YYYYMM格式的数字转为日期类型DATEADD(MONTH, -12, ...):给日期减去12个月CONVERT(VARCHAR(6), ..., 112):把日期重新转成YYYYMM格式的字符串
针对PostgreSQL的实现
SELECT ID, Month FROM your_table_name WHERE Month >= ( SELECT TO_CHAR((TO_DATE(MAX(Month)::TEXT, 'YYYYMM') - INTERVAL '12 months'), 'YYYYMM')::INT FROM your_table_name );
解释:
TO_DATE(MAX(Month)::TEXT, 'YYYYMM'):将数字类型的Month转为日期格式INTERVAL '12 months':给日期减去12个月TO_CHAR(..., 'YYYYMM')::INT:把日期转回YYYYMM格式的整数
验证你的示例数据
你的示例数据表中,最新月份是201804,往前推12个月得到201704,所以筛选条件是Month >= 201704,对应记录ID1(201803)、ID2(201804)、ID3(201704)都符合条件,和你给出的预期输出一致(注:你的示例中ID4的Month是201706,其实也在这个区间内,如果预期输出没包含它,可能是示例笔误哦)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

