当前位置: 代码迷 >> Oracle技术 >> oracle lag分析函数解决办法
  详细解决方案

oracle lag分析函数解决办法

热度:161   发布时间:2016-04-24 08:07:18.0
oracle lag分析函数
create table 
 userLoginTable(id    integer , user_id  integer ,  login_time    date);
 insert into  userLoginTable  values(1 ,  200 ,  to_date('2014-9-28 12:00:00','YYYY-MM-DD HH24:MI-SS'));
  insert into  userLoginTable  values(1 ,  200 ,  to_date('2014-9-28 12:40:00','YYYY-MM-DD HH24:MI-SS'));
insert into  userLoginTable  values(1 ,  200 ,  to_date('2014-9-28 13:05:00','YYYY-MM-DD HH24:MI-SS'));
insert into  userLoginTable  values(1 ,  200 ,  to_date('2014-9-28 13:30:00','YYYY-MM-DD HH24:MI-SS'));
 insert into  userLoginTable  values(1 ,  200 ,  to_date('2014-9-28 14:20:00','YYYY-MM-DD HH24:MI-SS'));
 insert into  userLoginTable  values(1 ,  200 ,  to_date('2014-9-28 15:10:00','YYYY-MM-DD HH24:MI-SS'));
insert into  userLoginTable  values(1 ,  200 ,  to_date('2014-9-28 17:30:00','YYYY-MM-DD HH24:MI-SS'));
insert into  userLoginTable  values(2 ,  300 ,  to_date('2014-9-29 13:30:00','YYYY-MM-DD HH24:MI-SS'));
 insert into  userLoginTable  values(2 ,  300 ,  to_date('2014-9-29 14:20:00','YYYY-MM-DD HH24:MI-SS'));
 insert into  userLoginTable  values(2 ,  300 ,  to_date('2014-9-29 15:10:00','YYYY-MM-DD HH24:MI-SS'));
 insert into  userLoginTable  values(2 ,  300 ,  to_date('2014-9-29 17:30:00','YYYY-MM-DD HH24:MI-SS')); 
 insert into  userLoginTable  values(2 ,  200 ,  to_date('2014-9-29 17:30:00','YYYY-MM-DD HH24:MI-SS')); 
 insert into  userLoginTable  values(2 ,  200 ,  to_date('2014-9-30 17:30:00','YYYY-MM-DD HH24:MI-SS')); 

要求 得出连续两天的user_id;

 select  
              distinct  trunc(login_time)  time, user_id,
               lag(trunc(login_time), 1, null) over(partition by user_id order by user_id) timetrunc
          from userLoginTable  ;
我是这样写的。
但是我只能得到
200 2014/9/28
200 2014/9/29
300 2014/9/29
不知道怎么求出 次数 用于判断连续的天数。
求大神指点

         
------解决思路----------------------
引用:
         

select distinct user_id from(select distinct  trunc(login_time)  time, user_id,lag(trunc(login_time), 1, null) over(partition by user_id order by user_id,login_time) timetrunc from userLoginTable) where time=timetrunc+1 order by user_id  ;

------解决思路----------------------
引用:
我觉得不太对

在同一userid下,按照userid和login_time排序后,如果相邻连个login_time的差值是1,则这两条记录是相邻的两天,那么这个这个userid就是连续两天都有登陆
------解决思路----------------------
引用:
我觉得不太对

自己去环境试试就知道对错了,多测试测试就知道了
再提供一种不用分析函数的,这个可能好理解一点,但是应该没有分析函数执行速度快
with T AS (SELECT DISTINCT USERID,TRUNC(login_time) login_time FROM userLoginTable)
SELECT DISTINCT USERID
FROM T T1
WHERE EXISTS(SELECT 1 FROM T
          WHERE USERID=T1.USERID
          AND login_time=T1.login_time-1)
  相关解决方案