大发888注册


大发888注册你是我枕边的紫罗兰
大发888注册相信其他公司给出的最低都是十五亿美金,这点是可以肯定的。大发888注册那就意味着,易飞不需要多少游历,不需要很多很多东西,给他节省了太多的时间。大发888注册但是,大泽太远,夸父还没有跑到大泽,就在半路上被渴死了。
大发888注册中气十足的深山古钟接踵而至,透出一股禅意。大发888注册郝仁再扔下一千万在桌子上面说。大发888注册梦醒后才发现一切可悲不可泣。
大发888注册没有身不由己的开端,算不得好开端;没有皆大欢喜的收场,也算不得好的收场!
大发888注册同事:阿……嚏!  我:一个阿嚏,说明有人想你了。  同事:阿……嚏!阿……嚏!  我:两个阿嚏,说明有人骂你了。  同事:阿……嚏!阿……嚏!阿……嚏!我刚才打了三个阿嚏,那又是什么意思?  我:说明你感冒了!大发888注册清明时节,是生者为逝者寄托哀思的时刻。向曾经不愿改变,但又无能为力的过往心存一份敬畏。站在逝者的墓前,噙几滴泪水,献一束白花,焚一叠纸钱,洒几盅清酒,缅先人音容笑貌,静静守候着,守候着每一份思念的降临。远离他乡的游子,就选择十字路口,以同样的方式,寄托生者对逝者无尽哀思。
大发888注册这一生一世纠缠的彷徨,
大发888注册隔壁新开张了间酒楼,装修相当豪华,晚上约了几个老朋友去那喝酒,找了个包房,就开始了酒肉穿肠。  大约两个小时以后,大家都有点醉了,准备回去。  有个朋友说:“急了,先去个厕所。”  两分钟后就回来了,还没有坐到凳子上,他就颇有感慨的说:“这酒楼还真牛,连洗手间都摆了两席!特别是那个马桶……”  话音未落,门“呼”的一声,被人撞开,进来了个汉子,冲我们就吼:“刚才站在我们包厢茶几上拉尿的混蛋,他妈的给我滚出来!”大发888注册可是,易飞心中的忧虑越来越深。大发888注册我有了两个出色的孩子,他们将传承我和我的妻子的一切,他们才是我毕生的骄傲与杰作!

皇冠足球比分

大发论坛时时彩平台尊龙娱乐是黑网吗海天国际娱乐城注册送钱凯发娱乐乐宝娱乐城真人赌钱亚美国际娱乐城 金龙国际 www.am8.com 亚洲城娱乐 老k国际娱乐城 666k8.com 金威国际娱乐城 名人国际娱乐城 ag娱乐平台 V博娱乐城 威信县国语学校网站地图888真人注册送钱e8889.com网站地图通渭县国语学校网站地图99真人网站地图银联娱乐城网站地图老虎机评测网网站地图WWW81444Kj,com网站地图2015最新注册送白菜注册送钱e8889.com网站地图金牌娱乐开户网站地图A8娱乐场网站地图宝马足球投注网网站地图http://tinyurl.com/qg5buxd网站地图博天堂胜负彩分析软件网站地图皇冠网足球ka99999投注网网站地图网上投注nba网站地图http://tinyurl.com/neqfjhj网站地图tt娱乐 卸载网站地图管家婆中特网网站地图胜豪娱乐城网站地图老虎机技巧注册送钱e8889.com网站地图尊龙国际注册送钱e8889.com网站地图世爵平台网站地图赌真钱网站地图乐橙手机网站地图http://tinyurl.com/ogu7gfp网站地图百度网盘网站地图http://tinyurl.com/nr6gmng网站地图

求连续操作(登录)数量(次数)最大的记录(用户)

昨晚上老同事聚会,一个同事说道一个面试问题没有一个人做出来,就是求连续日期登录次数最大的用户,同事说借助 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
) t2
group by diffRn,Name 
order by LoginCount desc

答案是:

Name    diffRn    LoginCount
zhang    14    4

 

如果注释掉 top 1,我们就知道这个结果的由来了:

Name    diffRn    LoginCount
zhang    14    4
li    13    3
wang    14    2
wang    15    1
li    14    1
wang    13    1

 

这个问题也可以衍生出 求连续登录的用户,或者求连续登录15天的用户(比如QQ的签到功能),是不是很熟悉呢?

 

实际上,上面这个查询,遇到一天登录多次的情况下,统计是不准确的,例如,构造下面的测试数据:

insert UserLoginInfo (Name,LoginTime) values 
     ('zhang'    ,'2015-11-10 12:01:50')
    ,('li'            ,'2013-10-05 11:01:50')
    ,('li'            ,'2013-10-06 11:01:50')
    ,('li'            ,'2014-10-05 11:01:50')
    ,('li'            ,'2014-10-06 11:01:50')
    ,('li'            ,'2015-10-05 11:01:50')
    ,('li'            ,'2015-10-06 11:01:50')
    ,('li'            ,'2015-11-10 11:01:50')
    ,('li'            ,'2015-11-11 11:01:50')
    ,('wang'        ,'2015-11-09 11:01:50')
    ,('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')
    ;
View Code

这时应该先去除某天的重复数据,才是正确的,所以查询应该做如下改进:

select --top 1 
       Name,diffRn,COUNT(diffRn)as LoginCount 
from(
    select Name,diffDate,rn, (diffDate-rn) as diffRn 
    from(      
          select  Name, 
                  diffDate,
                  ROW_NUMBER() over(partition by Name order by diffDate asc) rn
          from ( 
                select distinct Name,DATEDIFF(d,LoginTime,getdate()) as diffDate 
                from  UserLoginInfo 
          ) t0
    ) t1
) t2
group by diffRn,Name 
order by LoginCount desc;

结果是:

Name    diffRn    LoginCount
zhang    14    4
wang    14    2
li    13    2
li    14    2
li    48    2
li    411    2
li    774    2
wang    13    1
wang    15    1

结果符合我们的预期,算是完整的答案了。

不知道别的同学还没有更好的解决方案?

-------------------------------------------

PS:如果你经常会在程序中写这样复杂的SQL,推荐你使用PDF.NET SOD框架SQL-MAP功能,将SQL写在配置文件中,集中管理,并且方便跨数据库移植。

SOD框架 PDF.NET_SOD Ver 5.3.6.1125 已经发布,喜欢的朋友可以下载当前这个最新的稳定版本,有问题,可以加框架的QQ群:PDF.NET SOD高级群 18215717

 

posted on 2015-11-28 11:45 深蓝医生 阅读(...) 评论(...) 编辑 收藏

导航

公告