SQL语句如何查询各个用户最长的连续登陆天数?

zoroskj 2017-08-25 02:22:37
SQL语句如何查询各个用户最长的连续登陆天数?如图左边是源表User,右边是需要达到的查询结果,试了row_number,但是无法达到连续登陆这个条件。
...全文
5334 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_46609562 2021-03-22
  • 打赏
  • 举报
回复
最近连续登陆天数 怎么查询呢
Daniel_¹⁰²⁴ 2021-01-13
  • 打赏
  • 举报
回复
如果跨月的情况 如何处理呢
Elim 2020-10-23
  • 打赏
  • 举报
回复
回复下,如何解决跨月的问题
day(lead-time)-row_number的意思是取这天在这个月的位置,如果‘天’是连续的则day()递增,而row_number也是递增的,故day()-row_number是固定值;
由day(lead-time)发散下,跨月的时候不能取这天在这个月的位置,但可以取它跟某天(如1970-01-01)的天数差,如果loadtime是连续的则它跟固定某天的天数差也是递增;

因此,整块代码可优化为:
select t.uid
,max(连续登陆天数) 最大连续登陆天数
from
(Select uid,Grp_No,count(*) as 连续登陆天数
From (
Select uid,load_time,(datediff(load_time,'1970-01-01')-ROW_NUMBER() OVER (Partition By uid Order By uid,load_time)) as Grp_No
From Tmp_Data
) a
Group By uid,Grp_No
)t
group by t.uid;
cutwind 2019-08-26
  • 打赏
  • 举报
回复
[quote=引用 4 楼 顺势而为1 的回复:] [quote=引用 3 楼 qq_37170555 的回复:] [quote=引用 2 楼 appetizing_fish1 的回复:] [code=sql] if not object_id(N'Tempdb..#Tmp_Data') is null drop table #Tmp_Data Go create table #Tmp_Data ( List_ID int identity(1,1), UID varchar(10), LoadTime datetime ) INSERT INTO #Tmp_Data Select '201','2017/01/01' union all Select '201','2017/01/02' union all Select '202','2017/01/02' union all Select '202','2017/01/03' union all Select '203','2017/01/03' union all Select '201','2017/01/04' union all Select '202','2017/01/04' union all Select '201','2017/01/05' union all Select '202','2017/01/05' union all Select '201','2017/01/06' union all Select '203','2017/01/06' union all Select '203','2017/01/07' Select UID,max(cnt) as cnt From ( Select UID,Grp_No,count(*) as cnt From ( Select UID,LoadTime,(Day(LoadTime)-ROW_NUMBER() OVER (Partition By UID Order By UID,LoadTime)) as Grp_No From #Tmp_Data ) a Group By UID,Grp_No ) a Group By UID 假设用户 之前连续登陆 30天 昨天没有登陆 那今天统计的 就1天的连续登陆了
bigbig聚 2019-08-16
  • 打赏
  • 举报
回复
引用 4 楼 顺势而为1 的回复:
[quote=引用 3 楼 qq_37170555 的回复:]
[quote=引用 2 楼 appetizing_fish1 的回复:]


if not object_id(N'Tempdb..#Tmp_Data') is null
drop table #Tmp_Data
Go

create table #Tmp_Data
(
List_ID int identity(1,1),
UID varchar(10),
LoadTime datetime
)

INSERT INTO #Tmp_Data
Select '201','2017/01/01' union all
Select '201','2017/01/02' union all
Select '202','2017/01/02' union all
Select '202','2017/01/03' union all
Select '203','2017/01/03' union all
Select '201','2017/01/04' union all
Select '202','2017/01/04' union all
Select '201','2017/01/05' union all
Select '202','2017/01/05' union all
Select '201','2017/01/06' union all
Select '203','2017/01/06' union all
Select '203','2017/01/07'


Select UID,max(cnt) as cnt
From (
Select UID,Grp_No,count(*) as cnt
From (
Select UID,LoadTime,(Day(LoadTime)-ROW_NUMBER() OVER (Partition By UID Order By UID,LoadTime)) as Grp_No
From #Tmp_Data
) a
Group By UID,Grp_No
) a
Group By UID




这逻辑太厉害了,能不能传点功力给我哈。咋就能突然想到用day(loadtime)来减去row_number的值啊,这不正好就可以用来group了。为啥我就想不到呢,大神[/quote]
过奖了, 功力是靠自己慢慢磨出来的, 多混点论坛, 经常看看高手的写法,比如二月十六,道素.., 慢慢就有些灵感了.

[/quote]如果时间维度跨越好几个月,这种写法好像有问题吧。像以06-30,07-01这种时间,day是30,1,排名是1,2,这样一减就不是都-1了
倪rongya^_- 2019-01-14
  • 打赏
  • 举报
回复
Quote: 引用 2 楼 appetizing_fish1 的回复:

SQL code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
if not object_id(N'Tempdb..#Tmp_Data') is null
drop table #Tmp_Data
Go

create table #Tmp_Data
(
List_ID int identity(1,1),
UID varchar(10),
LoadTime datetime
)

INSERT INTO #Tmp_Data
Select '201','2017/01/01' union all
Select '201','2017/01/02' union all
Select '202','2017/01/02' union all
Select '202','2017/01/03' union all
Select '203','2017/01/03' union all
Select '201','2017/01/04' union all
Select '202','2017/01/04' union all
Select '201','2017/01/05' union all
Select '202','2017/01/05' union all
Select '201','2017/01/06' union all
Select '203','2017/01/06' union all
Select '203','2017/01/07'


Select UID,max(cnt) as cnt
From (
Select UID,Grp_No,count(*) as cnt
From (
Select UID,LoadTime,(Day(LoadTime)-ROW_NUMBER() OVER (Partition By UID Order By UID,LoadTime)) as Grp_No
From #Tmp_Data
) a
Group By UID,Grp_No
) a
Group By UID


这逻辑太厉害了,能不能传点功力给我哈。咋就能突然想到用day(loadtime)来减去row_number的值啊,这不正好就可以用来group了。为啥我就想不到呢,大神

过奖了, 功力是靠自己慢慢磨出来的, 多混点论坛, 经常看看高手的写法,比如二月十六,道素.., 慢慢就有些灵感了.

今天搜连续连续登陆的问题,居然用上了这个,大神
顺势而为1 2017-08-25
  • 打赏
  • 举报
回复
引用 3 楼 qq_37170555 的回复:
[quote=引用 2 楼 appetizing_fish1 的回复:]


if not object_id(N'Tempdb..#Tmp_Data') is null
    drop table #Tmp_Data
Go

create table #Tmp_Data
(
    List_ID int identity(1,1),
	UID varchar(10),
	LoadTime datetime
)

INSERT INTO #Tmp_Data
Select '201','2017/01/01' union all
Select '201','2017/01/02' union all
Select '202','2017/01/02' union all
Select '202','2017/01/03' union all
Select '203','2017/01/03' union all
Select '201','2017/01/04' union all
Select '202','2017/01/04' union all
Select '201','2017/01/05' union all
Select '202','2017/01/05' union all
Select '201','2017/01/06' union all
Select '203','2017/01/06' union all
Select '203','2017/01/07' 


Select UID,max(cnt) as cnt
From (
			Select UID,Grp_No,count(*) as cnt
			From (
					Select UID,LoadTime,(Day(LoadTime)-ROW_NUMBER() OVER (Partition By UID Order By UID,LoadTime)) as Grp_No 
					From #Tmp_Data 
				  ) a
			Group By UID,Grp_No
	  ) a
Group By UID


这逻辑太厉害了,能不能传点功力给我哈。咋就能突然想到用day(loadtime)来减去row_number的值啊,这不正好就可以用来group了。为啥我就想不到呢,大神[/quote] 过奖了, 功力是靠自己慢慢磨出来的, 多混点论坛, 经常看看高手的写法,比如二月十六,道素.., 慢慢就有些灵感了.
听雨停了 2017-08-25
  • 打赏
  • 举报
回复
引用 2 楼 appetizing_fish1 的回复:


if not object_id(N'Tempdb..#Tmp_Data') is null
    drop table #Tmp_Data
Go

create table #Tmp_Data
(
    List_ID int identity(1,1),
	UID varchar(10),
	LoadTime datetime
)

INSERT INTO #Tmp_Data
Select '201','2017/01/01' union all
Select '201','2017/01/02' union all
Select '202','2017/01/02' union all
Select '202','2017/01/03' union all
Select '203','2017/01/03' union all
Select '201','2017/01/04' union all
Select '202','2017/01/04' union all
Select '201','2017/01/05' union all
Select '202','2017/01/05' union all
Select '201','2017/01/06' union all
Select '203','2017/01/06' union all
Select '203','2017/01/07' 


Select UID,max(cnt) as cnt
From (
			Select UID,Grp_No,count(*) as cnt
			From (
					Select UID,LoadTime,(Day(LoadTime)-ROW_NUMBER() OVER (Partition By UID Order By UID,LoadTime)) as Grp_No 
					From #Tmp_Data 
				  ) a
			Group By UID,Grp_No
	  ) a
Group By UID


这逻辑太厉害了,能不能传点功力给我哈。咋就能突然想到用day(loadtime)来减去row_number的值啊,这不正好就可以用来group了。为啥我就想不到呢,大神
顺势而为1 2017-08-25
  • 打赏
  • 举报
回复


if not object_id(N'Tempdb..#Tmp_Data') is null
    drop table #Tmp_Data
Go

create table #Tmp_Data
(
    List_ID int identity(1,1),
	UID varchar(10),
	LoadTime datetime
)

INSERT INTO #Tmp_Data
Select '201','2017/01/01' union all
Select '201','2017/01/02' union all
Select '202','2017/01/02' union all
Select '202','2017/01/03' union all
Select '203','2017/01/03' union all
Select '201','2017/01/04' union all
Select '202','2017/01/04' union all
Select '201','2017/01/05' union all
Select '202','2017/01/05' union all
Select '201','2017/01/06' union all
Select '203','2017/01/06' union all
Select '203','2017/01/07' 


Select UID,max(cnt) as cnt
From (
			Select UID,Grp_No,count(*) as cnt
			From (
					Select UID,LoadTime,(Day(LoadTime)-ROW_NUMBER() OVER (Partition By UID Order By UID,LoadTime)) as Grp_No 
					From #Tmp_Data 
				  ) a
			Group By UID,Grp_No
	  ) a
Group By UID


  • 打赏
  • 举报
回复
试试这个

SELECT  [UID] , COUNT(*) AS 记录数
FROM  ( SELECT  * ,RN1 - ROW_NUMBER() OVER ( PARTITION BY [UID] ORDER BY RN1 ) AS Grp
          FROM ( SELECT  * , ROW_NUMBER() OVER ( ORDER BY RAND() ) AS RN1 FROM  #t  ) AS t
        ) AS t2
GROUP BY [UID] , t2.Grp order by min ([RN1]);  
#T 换成你的表名

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧