为难的,这种 SQL语句不好下手,求各种提示

天南海北 发布于 2012/02/27 19:52
阅读 1K+
收藏 4
SQL
请问下“连续三天都有登陆记录,且三天登陆在线时长总和大于等于5小时”,这个怎么写SQL语句?

我们有玩家登录日志表,
表A:
账号名,角色名,登入时间,登出时间,登录IP


也有每个玩家每天在线时长的表

表B:
账号名,角色名,在线时长,当天日期

以下是问题补充:

@天南海北:感谢各位的热心回答,我这里再补充一下: 我用的是Hive数据库,相关的日期函数也许有的不支持。详情请见:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions (2012/02/28 10:13)
加载中
0
用户已屏蔽
用户已屏蔽
让你为难的应该是,查三天登陆的。 而不是在线时间》5的。
0
CheckStyle
CheckStyle

很简单的啊,我觉得第二张表是干扰

伪代码,自己看一下就行了.思路在这里

 

select id

from account

where  logout_time-login_time>=3 

union all

select id from account t where t.id in (

   select a.id

   from T a inner join T b on a.id=b.id and DATEDIFF(day, a. login_time , b. login_time ) = 1 inner join

  T c on c.id=b,id AND  DATEDIFF(day, b. login_time , c. login_time ) = 1 

0
CheckStyle
CheckStyle
难点是在Union的后半句,不过前半句考虑了那种死不下线的网游挂机达人,所以就多考虑了一种情况
0
HuiDate
HuiDate
要先说明是哪种数据库呢!? 很多时候不同类型数据库有不同处理手段
0
CheckStyle
CheckStyle

引用来自“HuiDate”的答案

要先说明是哪种数据库呢!? 很多时候不同类型数据库有不同处理手段
没必要啊,这就是普通的SQL逻辑,不同数据库最多日期处理语法不通
0
HuiDate
HuiDate

引用来自“CheckStyle”的答案

引用来自“HuiDate”的答案

要先说明是哪种数据库呢!? 很多时候不同类型数据库有不同处理手段
没必要啊,这就是普通的SQL逻辑,不同数据库最多日期处理语法不通
呵~那好,举个例子,如果是oracle的话,用TO_DATE函数,它可以把两个日期相减得到数字大于等于5,可以符合你意思吧
0
CheckStyle
CheckStyle
呵呵,我的SQL里忘了加上数字大于5了.不过反正就是那个思路
0
IdleMan
IdleMan

1.求出A表最近三天连续登录的:

select  账号名,角色名 from
 (
    select  账号名,角色名 ,count(*) sl from 
    (
       select distinct  账号名,角色名,TO_CHAR(登入时间,'yyyymmdd') from a where 登入时间>=trunc(sysdate-3)
    )
 ) where sl=3

2.求出B表最近三天登录时长大于等于5小时:

select * from (
   select  账号名,角色名,sum(时长) sc from 
    (

     select  账号名,角色名,在线时长,当天日期  fom B where 当天日期>=trunc(sysdate-3)

     )
)  where sc>=5

3.两个子表一inner join,有结果的就满足

 

4.优化下,调整下时间、bug

IdleMan
IdleMan
@Y-QTCe :看错了。那数据量大了
Y-QTCe
Y-QTCe
人家求的是连续三天登录的,你怎么能改成最近三天连续登录的呢……
0
IdleMan
IdleMan

少了group by

select  账号名,角色名 from
 (
    select  账号名,角色名 ,count(*) sl from 
    (
       select distinct  账号名,角色名,TO_CHAR(登入时间,'yyyymmdd') d from a
           where 登入时间>=trunc(sysdate-3)
    ) group by   账号名,角色名,d
 ) where sl=3

--------------------------------------------------------
select * from (
   select  账号名,角色名,sum(时长) sc from 
    (

     select  账号名,角色名,在线时长,当天日期  from B 
           where 当天日期>=trunc(sysdate-3)

     ) group by   账号名,角色名
)  where sc>=5

 

0
天南海北
天南海北

引用来自“HuiDate”的答案

要先说明是哪种数据库呢!? 很多时候不同类型数据库有不同处理手段
是HIVE数据库,怪我没说清楚
返回顶部
顶部