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)