You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL筛选2022年每月近6个月有正向转账的客户ID

解决思路与可用函数

核心步骤

  1. 标准化日期格式
    原日期列是日/月/年的字符串,必须转换为数据库可计算的日期类型才能进行时间范围判断,使用TO_DATE函数(不同数据库语法略有差异):

    TO_DATE(your_date_column, 'DD/MM/YYYY')
    
  2. 生成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
      
  3. 校验客户转账条件
    对每个客户和每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:55:16