1.在線時(shí)長
正常的游戲有登錄和登出但是我們想計(jì)算下在線時(shí)長,這就涉及到根據(jù)登陸表的登錄時(shí)間查找登出時(shí)間的問題,基本的原理是登陸表和登出表進(jìn)行匹配,查找離一條登錄記錄最近的登出時(shí)間即min(登出-登錄)>0

2.最大連續(xù)登陸天數(shù)
游戲登錄表記錄的是游戲,用戶登陸的記錄,有些時(shí)候我們需要統(tǒng)計(jì)用戶的最大連續(xù)登陸天數(shù),這就面臨一個(gè)棘手的問題,如何判斷是否連續(xù),19日前面是18日的話是連續(xù)的,19日前面是17日的話就是不連續(xù)的,我們需要定義一個(gè)變量來存儲,開始的日期,還有...........
先看下結(jié)果


SET @num:=0; #開始日期
SET? ? @type:="";? # 存放useid
SET @lastdate:="2018-01-01";
SET? @b=0;
? SELECT? ? userid
? ? ? ? ? ,logdate
? ? ? ? ? ,@lastdate,
? ? ? ? ? ? @b:=IF(@type=userid ,DATEDIFF(logdate,@lastdate),0) as? num2
? ? ? ? ? ,@type:=userid?
? ? ? ? ? ,@lastdate:=logdate
FROM
(
SELECT? id as userid ,date(date ) as logdate
FROM? 20180704rolelogin
GROUP BY? ? id ,date(date )
) as a ;
3.計(jì)算連續(xù)天數(shù)和累計(jì)付費(fèi)金額


第一步,得到每一個(gè)連續(xù)日期的最早開始日期,有點(diǎn)繞口 直接看圖

第二部,對中間的結(jié)果進(jìn)行匯總統(tǒng)計(jì)

代碼解讀:

可用代碼:
SET @a:='2018-05-03' , @b:='',@c:=0; #定義臨時(shí)變量
SELECT? name ,a? as startdate,MAX(date) as enddate,sum(pay) as money
? FROM
? ? #核心部分
(SELECT? name,@a:=IF((DATEDIFF(date,@a)=@c)and(@b=name),@a,date) as a ,
? ? ? ? ? ? ? ? ? ? ? ? #如果日期連續(xù)就保持不變,否則重置為當(dāng)前日期
? ? ? ? ? ? ? date,pay,@b:=NAME #作為輔助列區(qū)分不同的name
? ? ? ? ? ? ? ,@c:=DATEDIFF(date,@a)+1 #日期差加1作為,下一個(gè)日期的判斷標(biāo)準(zhǔn)
FROM? xiaozhan as? a ) as a
GROUP BY? name,a