Oracle 连续登陆问题

– // 连续登陆问题 ORACLE SQL

-- 数据表结构
CREATE TABLE TMP_DT(
  MID  VARCHAR2(10),            -- 用户ID
  DT   date                     -- 用户登陆时间
);

-- 初始化数据
insert into TMP_DT (MID, DT) values ('U1', to_date('01-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('01-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('01-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('02-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('02-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('03-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('03-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('05-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U1', to_date('05-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('05-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('05-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('06-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('06-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('06-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('07-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('07-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('10-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('10-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U2', to_date('10-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('05-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('05-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('06-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('06-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('06-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('07-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('08-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('09-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('10-08-2016', 'dd-mm-yyyy'));
insert into TMP_DT (MID, DT) values ('U3', to_date('10-08-2016', 'dd-mm-yyyy'));

---------------------------------------------------------------------
-- oracle sql语句
-- 查询出符合条件的用户
-- 查询结果:连续登陆3天及以上,且每天登陆次数大于等于2
SELECT DISTINCT T.MID
FROM(
  SELECT MID,
         ROW_NUMBER() OVER(PARTITION BY B.MID ORDER BY B.DTC ASC) ROWNO,   -- 每个用户的登陆日期编号
         B.DTC - MIN(B.DTC) OVER(PARTITION BY B.MID)  DIF   -- 日期当前与用户最小日期的差值
    FROM ( --// 符合条件的日期
           SELECT A.MID,
                  TRUNC(A.DT,'DD') DTC
             FROM TMP_DT A
             GROUP BY A.MID, TRUNC(A.DT,'DD')
            HAVING COUNT(1) > 1    -- 每天登陆大于1ORDER BY A.MID, DTC ASC
        ) B
) T
GROUP BY T.MID, T.ROWNO-T.DIF  --对用户和 日期编号-日期差值 分组统计数量
HAVING COUNT(1) >= 3;   -- 连续登陆大于2天
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值