如何用SQL筛选2022年每月近6个月有正向转账的客户ID
解决思路与可用函数
核心步骤
标准化日期格式
原日期列是日/月/年的字符串,必须转换为数据库可计算的日期类型才能进行时间范围判断,使用TO_DATE函数(不同数据库语法略有差异):TO_DATE(your_date_column, 'DD/MM/YYYY')生成2022年全量月份列表
要针对2022年每个月做检查,需先生成1-12月的月份序列,可通过数据库自带的序列生成方式实现:- PostgreSQL:用
generate_series直接生成generate_series('2022-01-01'::date, '2022-12-01'::date, '1 month') AS stat_month - Oracle:用
CONNECT BY递归生成SELECT ADD_MONTHS('01-JAN-2022', LEVEL-1) AS stat_month FROM dual CONNECT BY LEVEL <=12 - MySQL:用递归CTE生成
WITH RECURSIVE months AS ( SELECT '2022-01-01' AS stat_month UNION ALL SELECT DATE_ADD(stat_month, INTERVAL 1 MONTH) FROM months WHERE stat_month < '2022-12-01' ) SELECT * FROM months
- PostgreSQL:用
校验客户转账条件
对每个客户和每个2022年的月份,判断该客户在「统计月份往前推6个月的起始日期到统计月份最后一天」的范围内,是否存在至少一笔client_cr > 0的转账。推荐用EXISTS子查询,效率更高:EXISTS ( SELECT 1 FROM your_table t WHERE t.client_id = target_clients.client_id -- 限定时间范围:统计月份前6个月至当月月底 AND TO_DATE(t.your_date_column, 'DD/MM/YYYY') >= ADD_MONTHS(stat_month, -6) AND TO_DATE(t.your_date_column, 'DD/MM/YYYY') <= LAST_DAY(stat_month) AND t.client_cr > 0 )
关键函数说明
TO_DATE():将字符串日期转换为日期类型,适配日/月/年格式。ADD_MONTHS()/DATE_ADD():计算往前推N个月的日期(MySQL用DATE_ADD,Oracle/PostgreSQL用ADD_MONTHS)。LAST_DAY():获取指定月份的最后一天,确保时间范围覆盖整个统计月份。EXISTS:快速判断是否存在满足条件的记录,比聚合函数更高效。
内容的提问来源于stack exchange,提问作者Ivan Kotlan
相关产品推荐
相关产品推荐

