1.在線時長
正常的游戲有登錄和登出但是我們想計算下在線時長,這就涉及到根據登陸表的登錄時間查找登出時間的問題,基本的原理是登陸表和登出表進行匹配,查找離一條登錄記錄最近的登出時間即min(登出-登錄)>0
2.最大連續登陸天數
游戲登錄表記錄的是游戲,用戶登陸的記錄,有些時候我們需要統計用戶的最大連續登陸天數,這就面臨一個棘手的問題,如何判斷是否連續,19日前面是18日的話是連續的,19日前面是17日的話就是不連續的,我們需要定義一個變量來存儲,開始的日期,還有...........
先看下結果
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.計算連續天數和累計付費金額
第一步,得到每一個連續日期的最早開始日期,有點繞口 直接看圖
第二部,對中間的結果進行匯總統計
代碼解讀:
可用代碼:
SET @a:='2018-05-03' , @b:='',@c:=0; #定義臨時變量
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 ,
? ? ? ? ? ? ? ? ? ? ? ? #如果日期連續就保持不變,否則重置為當前日期
? ? ? ? ? ? ? date,pay,@b:=NAME #作為輔助列區分不同的name
? ? ? ? ? ? ? ,@c:=DATEDIFF(date,@a)+1 #日期差加1作為,下一個日期的判斷標準
FROM? xiaozhan as? a ) as a
GROUP BY? name,a