求连续操作(登录)数量(次数)最大的记录(用户)
来源:互联网 发布:vb 无符号整型 编辑:程序博客网 时间:2024/06/08 07:53
昨晚上老同事聚会,一个同事说道一个面试问题没有一个人做出来,就是求连续日期登录次数最大的用户,同事说借助 rownumber即可求解,由于是喝酒聊天,也没有说详细的解决过程。今天早上想了下,终于想到了具体的解决思路。
登录时间里面有详细的时分秒数据,而我们的题目只要求连续的天数,所以使用DATEDIFF函数可以解决,
DATEDIFF(d,LoginTime,getdate()) as diffDate ,
有多个用户都在登录,因此应该以用户名为分区,登录时间为顺序来计算rownumber,因此,就是下面的表达式:
ROW_NUMBER() over(partition by Name order by LoginTime desc) as rn
关键问题来了,如何求得连续的登录情况?
如果是连续的记录,那么 diffDate- rn 肯定是相同的!
OK,果然这种方式很巧妙,那么我们最终的SQL写出来也不难了。
开始动手,先构造一个表,插入初始数据:
/* 求连续登录次数最多的用户*/create table UserLoginInfo( ID int IDENTITY primary key, Name varchar(50) not null, LoginTime datetime not null ) go insert UserLoginInfo (Name,LoginTime) values('zhang','2015-11-10 12:01:50') ,('li','2015-11-11 11:01:50') ,('wang','2015-11-9 11:01:50'); go insert UserLoginInfo (Name,LoginTime) values ('zhang','2015-11-11 12:01:50'), ('li','2015-11-11 12:01:50'), ('wang','2015-11-11 11:01:50'), ('zhang','2015-11-12 12:01:50'), ('li','2015-11-13 13:01:50'), ('wang','2015-11-12 11:01:50'), ('zhang','2015-11-13 12:01:50'), ('li','2015-11-14 11:01:50'), ('wang','2015-11-14 11:01:50'); go
然后用下面的SQL得到结果:
select top 1 Name,diffRn,COUNT(diffRn)as LoginCount from( select Name,diffDate,rn, (diffDate-rn) as diffRn from( select ID,Name, DATEDIFF(d,LoginTime,getdate()) as diffDate , ROW_NUMBER() over(partition by Name order by LoginTime desc) as rn from UserLoginInfo ) t1) t2group by diffRn,Name order by LoginCount desc
答案是:
Name diffRn LoginCountzhang 14 4
如果注释掉 top 1,我们就知道这个结果的由来了:
Name diffRn LoginCountzhang 14 4li 13 3wang 14 2wang 15 1li 14 1wang 13 1
这个问题也可以衍生出 求连续登录的用户,或者求联系登录15天的用户(比如QQ的签到功能),是不是很熟悉呢?
不知道别的同学还没有更好的解决方案?
-------------------------------------------
PS:如果你经常会在程序中写这样复杂的SQL,推荐你使用PDF.NET SOD框架的SQL-MAP功能,将SQL写在配置文件中,集中管理,并且方便跨数据库移植。
SOD框架 PDF.NET_SOD Ver 5.3.6.1125 已经发布,喜欢的朋友可以下载当前这个最新的稳定版本,有问题,可以加框架的QQ群:PDF.NET SOD高级群 18215717
- 求连续操作(登录)数量(次数)最大的记录(用户)
- JS记录用户登录次数的代码
- 求连续段最大和(dp)
- 获取用户登录次数(cookie)
- JS记录用户登录次数
- 编程珠玑(四)求一个字符串中连续出现的次数最多的子串
- poj 3693 求出现次数最多的连续重复子串(具体的串)黑盒
- 最大连续出现的次数
- POJ 3693 Maximum repetition substring (求重复次数最多的连续子串,4级)
- 工作遇到求一个数组一个值连续出现的次数(php代码)
- poj 2559 求连续的最大矩形面积(也可用于ccf最大连续矩形面积)
- jsp之记录用户登录的总次数以及记录用户最后一次登录的时间
- 记录用户登录操作
- 自动筛选的技巧(1)-找到数量最大的几条记录
- (java)整数数组中求最大连续子序列之和,并且记录开始和结束位置
- (java)整数数组中求最大连续子序列之和,并且记录开始和结束位置
- 统计某个时段内连续登录N天以上的独立用户IP数量
- hdu1003 Max Sum (求连续子区间最大和)
- xblock-sdk学习笔记之制作studio界面
- App调用系统内置应用或跳转到设置页面
- mac环境下配置gradle 环境变量
- android5.1为锁屏设置一张固定加载的背景图片
- RecyclerView里notifyItemRemoved的坑
- 求连续操作(登录)数量(次数)最大的记录(用户)
- iPhone和iPad各代的分辨率
- [译] OpenStack Liberty 版本中的53个新变化
- 第二十九节 MT-iBeacon基站关于LightBlue软件的使用
- Oracle的入门及一些基本操作
- 在C++里类多一点好还是少一点好?
- 二分图匹配
- 友善之臂tiny4412使用SD卡烧录uboot,并使开发板从SD卡启动进入uboot过程记录。
- 队列的基本操作