create table loginlog(logintime datetime,u_id int)insert into loginlog select '2011-12-16',907
insert into loginlog select '2011-12-17',907
insert into loginlog select '2011-12-18',907
insert into loginlog select '2011-12-14',1100
insert into loginlog select '2011-12-15',1100
insert into loginlog select '2011-12-16',1100
insert into loginlog select '2011-12-13',1200
insert into loginlog select '2011-12-14',1200
insert into loginlog select '2011-12-16',1200
insert into loginlog select '2011-12-17',1200
insert into loginlog select '2011-12-18',1200
go
select distinct u_id,count(*) as login_num from loginlog
where logintime between convert(varchar(10),DATEADD(DD,-5,'2011-12-18'),120)
and CONVERT(varchar(10),'2011-12-18',120)
group by u_id
having COUNT(*)>=3 order by login_num desc目前这样的话只能查询到登陆的次数,如果“where logintime between convert(varchar(10),DATEADD(DD,-3,'2011-12-18')”DD后面的-3换成-5就会显示5条数据,我要的是显示连续登陆次数为3次,因为13~18只有16 17 18 是连续的。麻烦各位了!
insert into loginlog select '2011-12-17',907
insert into loginlog select '2011-12-18',907
insert into loginlog select '2011-12-14',1100
insert into loginlog select '2011-12-15',1100
insert into loginlog select '2011-12-16',1100
insert into loginlog select '2011-12-13',1200
insert into loginlog select '2011-12-14',1200
insert into loginlog select '2011-12-16',1200
insert into loginlog select '2011-12-17',1200
insert into loginlog select '2011-12-18',1200
go
select distinct u_id,count(*) as login_num from loginlog
where logintime between convert(varchar(10),DATEADD(DD,-5,'2011-12-18'),120)
and CONVERT(varchar(10),'2011-12-18',120)
group by u_id
having COUNT(*)>=3 order by login_num desc目前这样的话只能查询到登陆的次数,如果“where logintime between convert(varchar(10),DATEADD(DD,-3,'2011-12-18')”DD后面的-3换成-5就会显示5条数据,我要的是显示连续登陆次数为3次,因为13~18只有16 17 18 是连续的。麻烦各位了!
把having count(*)>=3改成having count(*)=3试试
if OBJECT_ID('loginlog') is not null
drop table loginlog
go
create table loginlog(
logintime datetime,
u_id int
)
go
insert into loginlog select '2011-12-16',907
insert into loginlog select '2011-12-17',907
insert into loginlog select '2011-12-18',907
insert into loginlog select '2011-12-14',1100
insert into loginlog select '2011-12-15',1100
insert into loginlog select '2011-12-16',1100
insert into loginlog select '2011-12-13',1200
insert into loginlog select '2011-12-14',1200
insert into loginlog select '2011-12-16',1200
insert into loginlog select '2011-12-17',1200
insert into loginlog select '2011-12-18',1200
go
select distinct u_id,count(*) as login_num from loginlog
where logintime between convert(varchar(10),DATEADD(DD,-5,'2011-12-18'),120)
and CONVERT(varchar(10),'2011-12-18',120)
group by u_id
having COUNT(*)=3 order by login_num desc
/*
目前这样的话只能查询到登陆的次数,
如果“where logintime between convert(varchar(10),DATEADD(DD,-3,'2011-12-18')”
DD后面的-3换成-5就会显示5条数据,我要的是显示连续登陆次数为3次,
因为13~18只有16 17 18 是连续的。麻烦各位了!
*//*
u_id login_num
907 3
1100 3
*/
create table loginlog(logintime datetime,u_id int)insert into loginlog select '2011-12-16',907
insert into loginlog select '2011-12-17',907
insert into loginlog select '2011-12-18',907
insert into loginlog select '2011-12-14',1100
insert into loginlog select '2011-12-15',1100
insert into loginlog select '2011-12-16',1100
insert into loginlog select '2011-12-13',1200
insert into loginlog select '2011-12-14',1200
insert into loginlog select '2011-12-16',1200
insert into loginlog select '2011-12-17',1200
insert into loginlog select '2011-12-18',1200
;with t as
(select row_number() over(partition by u_id order by logintime) rn,
logintime,u_id from loginlog
)
select a.u_id,
a.logintime 'logintime1',
b.logintime 'logintime2',
c.logintime 'logintime3'
from t a
left join t b on a.u_id=b.u_id and a.rn=b.rn-1
left join t c on a.u_id=c.u_id and a.rn=c.rn-2
where datediff(d,a.logintime,b.logintime)=1
and datediff(d,b.logintime,c.logintime)=1u_id logintime1 logintime2 logintime3
----------- ----------------------- ----------------------- -----------------------
907 2011-12-16 00:00:00.000 2011-12-17 00:00:00.000 2011-12-18 00:00:00.000
1100 2011-12-14 00:00:00.000 2011-12-15 00:00:00.000 2011-12-16 00:00:00.000
1200 2011-12-16 00:00:00.000 2011-12-17 00:00:00.000 2011-12-18 00:00:00.000(3 row(s) affected)
if OBJECT_ID('loginlog') is not null
drop table loginlog
go
create table loginlog(
logintime datetime,
u_id int
)
go
insert into loginlog select '2011-12-16',907
insert into loginlog select '2011-12-17',907
insert into loginlog select '2011-12-18',907
insert into loginlog select '2011-12-14',1100
insert into loginlog select '2011-12-15',1100
insert into loginlog select '2011-12-16',1100
insert into loginlog select '2011-12-13',1200
insert into loginlog select '2011-12-14',1200
insert into loginlog select '2011-12-16',1200
insert into loginlog select '2011-12-17',1200
insert into loginlog select '2011-12-18',1200
;with T
as
(
select ROW_NUMBER()OVER(partition by u_id order by logintime asc)as num,
logintime as col1,u_id
from loginlog
)
select distinct b.u_id,count(*)as login_num from
(select T.col1,T.u_id,a.logintime as col2
from T left join
(select ROW_NUMBER()OVER(partition by u_id order by logintime asc)as num,
* from loginlog)a
on T.u_id=a.u_id and T.num=a.num+1)b
where col1 between convert(varchar(10),DATEADD(DD,-5,'2011-12-18'),120)
and CONVERT(varchar(10),'2011-12-18',120)
and DATEDIFF(DD,col1,col2)=-1
group by u_id
having COUNT(*)>=3 order by login_num desc/*
u_id login_num
1200 3
*/
create table loginlog(logintime datetime,u_id int)insert into loginlog select '2011-12-16',907
insert into loginlog select '2011-12-17',907
insert into loginlog select '2011-12-18',907
insert into loginlog select '2011-12-14',1100
insert into loginlog select '2011-12-15',1100
insert into loginlog select '2011-12-16',1100
insert into loginlog select '2011-12-13',1200
insert into loginlog select '2011-12-14',1200
insert into loginlog select '2011-12-16',1200
insert into loginlog select '2011-12-17',1200
insert into loginlog select '2011-12-18',1200
;with
t1 as
(select row_number() over(partition by u_id order by logintime) rn,
logintime,u_id from loginlog
),
t2 as
(select rn,logintime,u_id,
rn-datediff(d,(select min(logintime) from t1),logintime) dd
from t1
)
select u_id,count(*) 'login_num'
from t2
group by u_id,dd
having count(*)>=3 --> 如果是连续10来天或很多天,修改此处的3.
u_id login_num
----------- -----------
907 3
1100 3
1200 3(3 row(s) affected)
--呵呵昨天我写好了..你结贴了..今天直接复制
create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
insert into #loginlog select '2011-12-17',907
insert into #loginlog select '2011-12-18',907
insert into #loginlog select '2011-12-14',1100
insert into #loginlog select '2011-12-15',1100
insert into #loginlog select '2011-12-16',1100
insert into #loginlog select '2011-12-13',1200
insert into #loginlog select '2011-12-15',1200
insert into #loginlog select '2011-12-16',1200
insert into #loginlog select '2011-12-17',1200
insert into #loginlog select '2011-12-18',1200
go
--同一个帐号,连续登陆的天数
;WITH cte AS
(
SELECT b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,logintime),112)AS dn,COUNT(1) AS counts
FROM
(
SELECT u_id,ROW_NUMBER()OVER(PARTITION BY u_id ORDER BY logintime) AS sn,logintime
FROM #loginlog
)AS b
GROUP BY b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,b.logintime),112)
)
SELECT * FROM cte where counts>1--鸭子,你又结贴了u_id dn counts
----------- -------- -----------
1200 20111212 1
1100 20111213 3
1200 20111213 4
907 20111215 3(4 行受影响)
--哥.我又来了...
create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
insert into #loginlog select '2011-12-17',907
insert into #loginlog select '2011-12-18',907
insert into #loginlog select '2011-12-14',1100
insert into #loginlog select '2011-12-15',1100
insert into #loginlog select '2011-12-16',1100
insert into #loginlog select '2011-12-13',1200
insert into #loginlog select '2011-12-15',1200
insert into #loginlog select '2011-12-16',1200
insert into #loginlog select '2011-12-17',1200
insert into #loginlog select '2011-12-18',1200
go
--同一个帐号,连续登陆的最大天数
;WITH cte AS
(
SELECT b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,logintime),112)AS dn,COUNT(1) AS counts
FROM
(
SELECT u_id,ROW_NUMBER()OVER(PARTITION BY u_id ORDER BY logintime) AS sn,logintime
FROM #loginlog
)AS b
GROUP BY b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,b.logintime),112)
)
SELECT cte.u_id,MAX(counts) FROM cte GROUP BY cte.u_id
create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
insert into #loginlog select '2011-12-17',907
insert into #loginlog select '2011-12-18',907
insert into #loginlog select '2011-12-14',1100
insert into #loginlog select '2011-12-15',1100
insert into #loginlog select '2011-12-16',1100
insert into #loginlog select '2011-12-13',1200
insert into #loginlog select '2011-12-15',1200
insert into #loginlog select '2011-12-16',1200
insert into #loginlog select '2011-12-17',1200
insert into #loginlog select '2011-12-18',1200
go
--同一个帐号,连续登陆的最大天数
;WITH cte AS
(
SELECT b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,logintime),112)AS dn,COUNT(1) AS counts
FROM
(
SELECT u_id,ROW_NUMBER()OVER(PARTITION BY u_id ORDER BY logintime) AS sn,logintime
FROM #loginlog
)AS b
GROUP BY b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,b.logintime),112)
)
SELECT cte.u_id,MAX(counts) as counts FROM cte GROUP BY cte.u_id
create table #loginlog(logintime datetime,u_id int)insert into #loginlog select '2011-12-16',907
insert into #loginlog select '2011-12-17',907
insert into #loginlog select '2011-12-18',907
insert into #loginlog select '2011-12-14',1100
insert into #loginlog select '2011-12-15',1100
insert into #loginlog select '2011-12-16',1100
insert into #loginlog select '2011-12-13',1200
insert into #loginlog select '2011-12-15',1200
insert into #loginlog select '2011-12-16',1200
insert into #loginlog select '2011-12-17',1200
insert into #loginlog select '2011-12-18',1200
go
--同一个帐号,连续登陆的最大天数
;WITH cte AS
(
SELECT b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,logintime),112)AS dn,COUNT(1) AS counts
FROM
(
SELECT u_id,ROW_NUMBER()OVER(PARTITION BY u_id ORDER BY logintime) AS sn,logintime
FROM #loginlog
)AS b
GROUP BY b.u_id,CONVERT(CHAR(8),DATEADD(day,-sn,b.logintime),112)
)
SELECT cte.u_id,MAX(counts) as counts FROM cte GROUP BY cte.u_id