如何在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-01ADD_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
相关产品推荐
相关产品推荐

