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

如何在Oracle中筛选最近三个月每月都有登录记录的客户ID

Oracle SQL 实现方案

思路说明

  • 第一步:过滤掉所有不在近三个月范围内的登录记录
  • 第二步:对同一个客户的登录记录按月份去重,避免同一个月多次登录被重复计数
  • 第三步:按客户ID分组,统计每个客户的登录月份数,刚好为3的就是近三个月每个月都有登录的客户

完整SQL语句

SELECT ID
FROM (
    -- 子查询:统计每个ID有登录记录的月份,同个月多次登录仅算1次
    SELECT DISTINCT ID, TRUNC(last_logged, 'MM') AS login_month
    FROM your_table_name -- 此处替换为你实际的表名
    WHERE last_logged >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3)
      AND last_logged < TRUNC(SYSDATE, 'MM')
)
GROUP BY ID
HAVING COUNT(login_month) = 3;

代码说明

  • TRUNC(SYSDATE, 'MM'):获取当前日期所在月份的第一天,比如当前是2021-09-15,返回结果为2021-09-01
  • ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3):往前推3个月的月份第一天,比如当前是9月,返回结果为2021-06-01
  • 过滤条件last_logged >= 前推3个月首日 AND last_logged < 当前月首日:刚好筛选出近三个月(不含当前月)的所有记录,和你举例的9月查询6、7、8月登录记录的逻辑完全匹配
  • 内层查询用DISTINCT ID, TRUNC(last_logged, 'MM'):合并同一个客户同一个月的多条登录记录,避免单月多次登录导致计数错误
  • 外层分组后筛选月份数等于3的ID,就是满足要求的客户

效果验证

拿你给出的测试数据举例,若当前为2021年9月:

  • 客户123的登录记录在6、7、8月各有1条,统计出来的月份数为3,会被筛选出来
  • 客户444的登录记录都在4、5月,不在6-8月范围内,不会被统计
    完全符合你给出的输出预期。

内容的提问来源于stack exchange,提问作者dingaro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:57:04